单源最短路问题,SPFA解法
//9050848 NKHelloWorld 2387 Accepted 272K 63MS C++ 1194B 2011-08-01 14:19:20 //9050982 NKHelloWorld 2387 Accepted 276K 63MS C++ 1559B 2011-08-01 14:30:19 //9050987 NKHelloWorld 2387 Accepted 680K 47MS G++ 1638B 2011-08-01 14:30:41 //1A µÚÒ»µÀSPFA #include <cstdio> #include <vector> #include <queue> #include <cstring> using namespace std; typedef struct { int to,dis; }EDGE; vector<EDGE> edge[1001]; queue<int> que; bool inque[1001]; int dis[1001],n,t,cnt[1001]; int spfa(int start,int end) { int i,a; memset(inque,false,sizeof(inque)); memset(cnt,0,sizeof(cnt)); for(i=1;i<=n;i++) dis[i] = 2147483647; dis[start] = 0; inque[start] = true; cnt[start] = 1; que.push(start); while(!que.empty()) { a = que.front(); que.pop(); inque[a] = false; for(i=0;i<edge[a].size();i++) { if(dis[edge[a][i].to] - edge[a][i].dis > dis[a]) { dis[edge[a][i].to] = dis[a] + edge[a][i].dis; if(! inque[edge[a][i].to]) { inque[edge[a][i].to] = true; que.push(edge[a][i].to); if(++cnt[edge[a][i].to] > n) { return -1; } } } } } return dis[end]; } int main() { int i,j,a,b,d; EDGE tedge; scanf("%d%d",&t,&n); for(i=1;i<=t;i++) { scanf("%d%d%d",&a,&b,&d); tedge.to = b; tedge.dis = d; edge[a].push_back(tedge); tedge.to = a; edge[b].push_back(tedge); } printf("%d\n",spfa(1,n)); return 0; }