#include<stdio.h>
#include<string.h>
#include<queue>
const int maxn = 70010;
const int inf = 0x3f3f3f3f;
using namespace std;
int vis[maxn] , cnt[maxn] , dist[maxn] , n , m , c , a , b;
struct G{
int head[maxn] , e;
struct T{
int u , v , next , cost;
}edge[maxn << 2];
void init(){
memset(head , -1 , sizeof(head));
e = 0;
};
void addedge(int u , int v , int c){
edge[e].u = u , edge[e].v = v , edge[e].cost = c , edge[e].next = head[u] , head[u] = e ++;
};
}g;
int relax(int u , int v , int c){
if(dist[u] + c < dist[v]){
dist[v] = dist[u] + c;
return 1;
}
return 0;
}
int SPFA(int src , int des){
memset(vis , 0 , sizeof(vis));
memset(cnt , 0 , sizeof(cnt));
for(int i = 0 ; i < n ; i ++){
dist[i] = inf;
}
dist[src] = 0 , vis[src] = 1 , ++ cnt[src];
queue<int> q;
q.push(src);
while(!q.empty()){
int u = q.front();
int v;
q.pop();
vis[u] = 0;
for(int i = g.head[u] ; i != -1 ; i = g.edge[i].next){
v = g.edge[i].v;
//printf("i = %d u = %d v = %d\n" , i , u , v);
if(relax(u , v , g.edge[i].cost) && !vis[v]){
q.push(v); vis[v] = 1;
if(++ cnt[v] > n) return -1;
}
}
}
if(dist[des] == inf) return -2;
return dist[des];
}
int main(){
int src , des;
while(~scanf("%d%d" , &n , &m)){
g.init();
for(int i = 0 ; i < m ; i ++){
scanf("%d%d%d" , &a , &b , &c);
g.addedge(a , b , c);
g.addedge(b , a , c);
}
scanf("%d%d" , &src , &des);
int ans = SPFA(src , des);
if(ans < 0 || ans == inf) printf("-1\n");
else{
printf("%d\n" , ans);
}
}
}
hdu 1874 畅通工程续 (SPFA模板)
最新推荐文章于 2020-06-02 17:36:33 发布