#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;
}
HDU 1874 畅通工程续(spfa)
猜你喜欢
转载自blog.csdn.net/ccshijtgc/article/details/83178751
今日推荐
周排行