• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie Bug - potyczki algorytmiczne

Object Storage Arubacloud
0 głosów
204 wizyt
pytanie zadane 10 lipca 2023 w C i C++ przez Dani Obywatel (1,450 p.)

Cześć, ogólnie to robię zadanie Bug : https://szkopul.edu.pl/problemset/problem/wh8bZRITUAHN9t6ZvJdhNkAa/site/?key=statement i ten kod wchodzi na 60 pkt, nie mam pojęcia dlaczego.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int MAXN = 4e5 + 7;
vector<pair<int,int>> graph[MAXN];
int dist[MAXN];
int n,m;

void Dijkstra(int start){
    fill(dist,dist + 2*n + 1,1e9);
    priority_queue<pair<int,int>> Q;
    Q.push({start,0});
    while(Q.size()){
        auto [v,w] = Q.top();
        Q.pop();
        if(-w >= dist[v])
            continue;
        dist[v] = -w;
        
        for(auto [u,d] : graph[v]){
            if(dist[u] > dist[v] + d)
                Q.push({u,-(dist[v] + d)});
        }
    }
}

void add_edge(int a,int b,int w){
    graph[a].push_back({b,w});
    graph[b].push_back({a,w});
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin >> n >> m;

    for(int i=0;i<m;++i){
        int a,b,w;
        cin >> a >> b >> w;

        if(w & 1){
            add_edge(a,b + n,w);
            add_edge(a + n,b,w);
        }
        else{
            add_edge(a,b,w);
            add_edge(a+n,b+n,w);
        }
    }

    Dijkstra(1);
    if(dist[2 * n] == 1e9)
        cout << "0\n";
    else
        cout << dist[2 * n] << '\n';
    return 0;
}

 

komentarz 10 lipca 2023 przez Whistleroosh Maniak (56,980 p.)
Może priority_queue zabiera za dużo pamięci. Spróbuj podmienić to na set. Wtedy w linii 24. możesz dodatkowo usuwać stary wpis dla wierzchołka u

1 odpowiedź

0 głosów
odpowiedź 16 lipca 2023 przez Eriss69 Gaduła (4,470 p.)

Masz błąd w algorytmie dijkstra

Zamiast - (dist[v] + d), powinieneś użyć - (dist[v] - d).

if (dist[u] > dist[v] - d)
    Q.push({u, -(dist[v] - d)});

:) 
 

komentarz 16 lipca 2023 przez Whistleroosh Maniak (56,980 p.)
Wydaje mi sie, że powinno być jednak - (dist[v] + d)
komentarz 16 lipca 2023 przez Eriss69 Gaduła (4,470 p.)
Uzasadnij?
komentarz 16 lipca 2023 przez Eriss69 Gaduła (4,470 p.)
struct Edge {
    int to;
    int weight;
    Edge(int t, int w) : to(t), weight(w) {}
};

const int MAXN = 2e5 + 5;
vector<Edge> graph[MAXN];
int dist[MAXN];
int n, m;

void Dijkstra(int start) {
    fill(dist, dist + 2 * n + 1, 1e9);
    priority_queue<pair<int, int>> Q;
    Q.push({0, start});
    dist[start] = 0;

    while (!Q.empty()) {
        auto [w, v] = Q.top();
        Q.pop();
        w = -w; // Negacja, ponieważ kolejka priorytetowa ma domyślny porządek malejący.
        if (w > dist[v])
            continue;

        for (const auto& edge : graph[v]) {
            int u = edge.to;
            int d = edge.weight;
            if (dist[u] > dist[v] + d) {
                dist[u] = dist[v] + d;
                Q.push({-dist[u], u});
            }
        }
    }
}

void add_edge(int a, int b, int w) {
    graph[a].emplace_back(b, w);
}

Jedynie co mi przychodzi żeby dostało to 100pkt Jeszce to powyższy kod

komentarz 16 lipca 2023 przez Whistleroosh Maniak (56,980 p.)
W kodzie wyżej napisałeś dist[v] + d zamiast dist[v] - d, więc zgaduje, ze ta wersja jest poprawna
komentarz 16 lipca 2023 przez Whistleroosh Maniak (56,980 p.)
Ten kod może już teoretycznie przejść na 100, bo ostatnio dostawało 60 przez TLE i zbyt duże zużycie pamięci.
komentarz 4 sierpnia 2023 przez Eriss69 Gaduła (4,470 p.)

@Whistleroosh, my bad :) masz racje

Podobne pytania

0 głosów
1 odpowiedź 197 wizyt
0 głosów
0 odpowiedzi 124 wizyt
pytanie zadane 12 stycznia 2023 w Algorytmy przez pasjonat_algorytmiki Pasjonat (19,540 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...