HDU 1874 畅通工程续(spfa)

畅通工程续

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <climits>

using namespace std;
const int MAXN = 200+5;
const int MAXM = 1000+5;

int p[MAXN];
int cnt[MAXN];
bool inq[MAXN];
int d[MAXN];
int INF = 0x3f3f3f3f;
int ok;

int eid;
int n, m;

struct edge {
    int v;
    int next;
    int w;
} e[MAXM];

int edgeinsert( int u, int v, int wei) {
    e[eid].v = v;
    e[eid].w = wei;
    e[eid].next = p[u];
    p[u] = eid++;
}

int init() {
    memset(p, -1, sizeof(p));
    eid = 0;
}

void SPFA(int st) {
    memset(inq, false, sizeof(inq));
    memset(d, INF, sizeof(d));
    memset(cnt, 0, sizeof(cnt));
    ok = 1;

    d[st] = 0;
    inq[st] = true;
    queue<int>q;
    q.push(st);
    cnt[st]++;//进队加1

    while(!q.empty()) {
        int u = q.front();

        q.pop();
        inq[u] = false;

        for(int i = p[u]; i != -1; i = e[i].next) {
            int v = e[i].v;
            if(d[u] + e[i].w < d[v]) {
                d[v] = d[u] + e[i].w;

                if(!inq[v]) {
                    q.push(v);
                    inq[v] = true;
                    cnt[v]++;//进队加1
                }
            }
            if(cnt[v] > n) {//负环
                ok = 0;
                return;
            }

        }
    }

}


int main() {
    freopen("data.in","r",stdin);
    //freopen("data.out","w",stdout);
    ios::sync_with_stdio(false);

    while(cin >> n >>  m) {//n个节点 m条路径
        init();
        int a, b;
        for(int i = 1; i <= m; i++) {
            int a, b, w;
            cin >> a >> b >> w;
            edgeinsert(a, b, w);
            edgeinsert(b, a, w);
        }

        int s, t;
        cin >> s >> t;
        SPFA(s);

        if((d[t] == INF) || (ok == 0))
            cout << "-1" << endl;
        else
            cout<<d[t]<< endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/83178751