标签:uniq john class dijkstra top int stdio.h ant string
Input
Output
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
Hint
#include<stdio.h> #include<string.h> #include<limits.h> int a[1005][1005]; int dis[1005],b[1005]; int n; int min(int x,int y) { return x<y?x:y; } void dij(int k) { int i,j,mind,minj; memset(b,0,sizeof(b)); for(i=1;i<=n;i++){ dis[i]=INT_MAX; } dis[k]=0; for(i=1;i<n;i++){ mind=INT_MAX; for(j=1;j<=n;j++){ if(!b[j]&&dis[j]<mind){ mind=dis[j]; minj=j; } } b[minj]=1; for(j=1;j<=n;j++){ if(!b[j]&&a[minj][j]>=0){ dis[j]=min(dis[j],dis[minj]+a[minj][j]); } } } } int main() { int t,x,y,z; memset(a,-1,sizeof(a)); scanf("%d%d",&n,&t); while(t--){ scanf("%d%d%d",&x,&y,&z); a[x][y]=z; a[y][x]=z; } dij(1); printf("%d\n",dis[n]); return 0; }
优化Dij:
#include<stdio.h> #include<string.h> #include<limits.h> #include<vector> #include<queue> using namespace std; struct Node{ int v,w; friend bool operator<(Node a,Node b) { return a.w>b.w; } }node; vector<Node> a[1005]; int dis[1005]; int n; void dij(int k) { int v1,v2,i; priority_queue<Node> q; dis[k]=0; node.w=0; node.v=k; q.push(node); while(q.size()){ v1=q.top().v; q.pop(); for(i=0;i<a[v1].size();i++){ v2=a[v1][i].v; if(dis[v2]>dis[v1]+a[v1][i].w){ dis[v2]=dis[v1]+a[v1][i].w; node.w=dis[v2]; node.v=v2; q.push(node); } } } } int main() { int t,x,y,z,i; scanf("%d%d",&n,&t); for(i=1;i<=n;i++){ a[i].clear(); dis[i]=INT_MAX; } while(t--){ scanf("%d%d%d",&x,&y,&z); node.w=z; node.v=y; a[x].push_back(node); node.v=x; a[y].push_back(node); } dij(1); printf("%d\n",dis[n]); return 0; }
POJ 2387 Til the Cows Come Home Dijkstra求最短路径
标签:uniq john class dijkstra top int stdio.h ant string
原文地址:http://www.cnblogs.com/yzm10/p/7265228.html