Dijstra: 使用优先队列
#include<iostream> #include<queue> #include<cstring> #define INF 100000000 using namespace std; int map[1005][1005]; int d[1005]; int vis[105]; struct cmp { bool operator()(int a,int b) { return d[a]>d[b]; } }; int main() { int n,m; while(cin>>n>>m) { if(n==0&&m==0) break; int i,j,a,b,c; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { map[i][j]=INF; if(i==j) map[i][j]=0; } d[i]=INF; } d[1]=0; for(i=1;i<=m;i++) { cin>>a>>b>>c; map[a][b]=map[b][a]=c; } memset(vis,0,sizeof(vis)); priority_queue<int,vector<int>,cmp> q; q.push(1); while(!q.empty()) { int cur=q.top(); q.pop(); if(vis[cur]) continue; vis[cur]=1; for(i=1;i<=n;i++) { if(!vis[i]&&map[cur][i]<INF&&d[i]>d[cur]+map[cur][i]) { d[i]=d[cur]+map[cur][i]; q.push(i); } } } cout<<d[n]<<endl; } }这是AC代码,本来照着算法导论写了一个,总是不能ac 错误在于优先队列排列优先级是在push的时候而不是front的时候,
错误代码:
#include<iostream> #include<queue> #define INF 10000000 using namespace std; int map[105][105]; int d[105]; struct cmp { bool operator()(int a,int b) { return d[a]<d[b]; } }; int main() { int n,m; while(cin>>n>>m) { if(n==0&&m==0) break; int i,j,a,b,c; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=INF; d[i]=INF; } d[1]=0; for(i=1;i<=m;i++) { cin>>a>>b>>c; map[a][b]=map[b][a]=c; } priority_queue<int,vector<int>,cmp> q; for(i=1;i<=n;i++) //这个有问题,,,push之后后面的改变d不会改变优先队列 q.push(i); while(!q.empty()) { int cur=q.top(); q.pop(); for(i=1;i<=n;i++) { if(map[cur][i]!=INF) if(d[i]>d[cur]+map[cur][i]) d[i]=d[cur]+map[cur][i]; } } cout<<d[n]<<endl; } }
#include<iostream> #define INF 10000000 using namespace std; int map[105][105]; int d[105]; int main() { int n,m; while(cin>>n>>m) { if(n==0&&m==0) break; int i,j,a,b,c; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=INF; d[i]=INF; } d[1]=0; for(i=1;i<=m;i++) { cin>>a>>b>>c; map[a][b]=map[b][a]=c; } int k; for(i=1;i<=n-1;i++) { for(j=1;j<=n;j++) { for(k=1;k<=n;k++) { if(map[j][k]!=INF) { if(d[j]>d[k]+map[j][k]) d[j]=d[k]+map[j][k]; } } } } cout<<d[n]<<endl; } }