Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 30007 | Accepted: 10092 |
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
赤裸裸的Dijkstra 刚开始学最短路,先噜一发最简单的,刚学会用优先队列,所以用优先队列写的Dijkstra,对这个大材小用了,这个直接邻接矩阵就可以过(邻接矩阵注意重边取小)
#include <cstdio> #include <iostream> #include <cstring> #include <cctype> #include <cstdlib> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <list> using namespace std; const int maxn=500010; const int INF=1<<29; typedef struct node{ int p,w; node(int a,int b){p=a;w=b;} friend bool operator<(node a,node b){//权值小的先出队 if(a.w!=b.w) return a.w<b.w; return a.p<b.p; } }; vector <node> eg[maxn];//vector存图 int dis[maxn],n; void Dijkstra(int src) { for(int i=0;i<=n;i++) dis[i]=INF;//初始化 dis[src]=0; priority_queue <node> Q; Q.push(node(src,dis[src]));//源点入队 while(!Q.empty()){ node f=Q.top();Q.pop(); for(int i=0;i<eg[f.p].size();i++){ node t=eg[f.p][i]; if(dis[t.p]>t.w+f.w){ //三角形原则更新距离 dis[t.p]=t.w+f.w; Q.push(node(t.p,dis[t.p])); } } } } int main() { int u,v,m,w; while(scanf("%d%d",&m,&n)!=EOF){ for(int i=0;i<=n;i++) eg[i].clear(); while(m--){ scanf("%d%d%d",&u,&v,&w); eg[u].push_back(node(v,w)); eg[v].push_back(node(u,w)); } Dijkstra(1); printf("%d\n",dis[n]); } return 0; }
POJ 2387-Til the Cows Come Home(最短路Dijkstra+优先队列),布布扣,bubuko.com
POJ 2387-Til the Cows Come Home(最短路Dijkstra+优先队列)
原文:http://blog.csdn.net/qq_16255321/article/details/38639243