1 /* 2 题意:最短路 3 思路:spfa 4 时间:2018.07.18 5 */ 6 #include <bits/stdc++.h> 7 using namespace std; 8 9 typedef long long LL; 10 const int MAXN=100005; 11 const LL MOD7 = 1e9+7; 12 13 struct Edge 14 { 15 int u,v,c; 16 int next; 17 }edge[2*MAXN]; 18 int head[MAXN]; 19 int cnt; 20 21 int dis[MAXN]; 22 int vis[MAXN]; 23 int num[MAXN]; 24 int n,m; 25 26 void init() 27 { 28 cnt=0; 29 memset(head,-1,sizeof(head)); 30 } 31 32 void addEdge(int u,int v,int c) 33 { 34 edge[cnt].u=u;edge[cnt].v=v;edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++; 35 } 36 37 void spfa(int st,int et) 38 { 39 queue<int> q; 40 memset(vis,0,sizeof(vis)); 41 memset(dis,-1,sizeof(dis)); 42 memset(num,0,sizeof(num)); 43 while (!q.empty()) q.pop(); 44 q.push(st); 45 dis[st]=0; 46 vis[st]=1; 47 num[st]=1; 48 while (!q.empty()) 49 { 50 int u=q.front();q.pop(); 51 // if (u==et) break; 52 vis[u]=0; 53 for (int i=head[u];i!=-1;i=edge[i].next) 54 { 55 int v=edge[i].v; 56 int c=edge[i].c; 57 if (dis[v]==-1 || dis[u]+c<dis[v]) 58 { 59 dis[v]=dis[u]+c; 60 if (!vis[v]) 61 { 62 vis[v]=1; 63 q.push(v); 64 if (++num[v]>n) break; 65 } 66 } 67 } 68 } 69 printf("%d\n",dis[et]); 70 } 71 72 int main() 73 { 74 #ifndef ONLINE_JUDGE 75 freopen("test.txt","r",stdin); 76 #endif // ONLINE_JUDGE 77 int st,et; 78 scanf("%d%d",&n,&m); 79 scanf("%d%d",&st,&et); 80 init(); 81 int u,v,c; 82 for (int i=1;i<=m;++i) 83 { 84 scanf("%d%d%d",&u,&v,&c); 85 addEdge(u,v,c); 86 addEdge(v,u,c); 87 } 88 spfa(st,et); 89 return 0; 90 }