标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 38556 | Accepted: 13104 |
Description
Input
Output
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
注意:先输入边数后输入结点数,存在重边
#include"cstdio" using namespace std; const int MAXN=1005; const int INF=0x3fffffff; int mp[MAXN][MAXN]; int V,E; int vis[MAXN]; int d[MAXN]; int dijkstra(int s) { for(int i=1;i<=V;i++) { vis[i]=0; d[i]=mp[s][i]; } vis[s]=1; for(int i=1;i<=V;i++) { int mincost,k; mincost=INF; for(int j=1;j<=V;j++) { if(!vis[j]&&d[j]<mincost) { k=j; mincost=d[j]; } } vis[k]=1; for(int j=1;j<=V;j++) { if(!vis[j]&&d[j]>d[k]+mp[k][j]) { d[j]=d[k]+mp[k][j]; } } } return d[1]; } int main() { while(scanf("%d%d",&E,&V)!=EOF) { for(int i=1;i<=V;i++) for(int j=1;j<=V;j++) if(i==j) mp[i][j]=0; else mp[i][j]=INF; for(int i=0;i<E;i++) { int u,v,cost; scanf("%d%d%d",&u,&v,&cost); if(cost<mp[u][v]) mp[u][v]=mp[v][u]=cost;//存在重边 } int ans=dijkstra(V); printf("%d\n",ans); } return 0; }
堆优化的dijkstra
#include"cstdio" #include"vector" #include"queue" using namespace std; typedef pair<int,int> P; const int MAXN=1005; const int INF=0x3fffffff; int mp[MAXN][MAXN]; int V,E; vector<int> G[MAXN]; int d[MAXN]; void dijkstra(int s,int end) { for(int i=1;i<=V;i++) d[i]=INF; priority_queue<P, vector<P>,greater<P> > que; que.push(P(0,s)); d[s]=0; while(!que.empty()) { P p=que.top();que.pop(); if(p.second==end) { printf("%d\n",p.first); return ; } int v=p.second; if(d[v]<p.first) continue; for(int i=0;i<G[v].size();i++) { int to=G[v][i]; if(d[to]>d[v]+mp[v][to]) { d[to]=d[v]+mp[v][to]; que.push(P(d[to],to)); } } } } int main() { while(scanf("%d%d",&E,&V)!=EOF) { for(int i=1;i<=V;i++) { G[i].clear(); for(int j=1;j<=V;j++) if(i==j) mp[i][j]=0; else mp[i][j]=INF; } for(int i=0;i<E;i++) { int u,v,cost; scanf("%d%d%d",&u,&v,&cost); G[v].push_back(u); G[u].push_back(v); if(cost<mp[u][v]) mp[v][u]=mp[u][v]=cost; } dijkstra(1,V); } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5146137.html