POJ2387 最短路入门题 [spfa,dijstra+heap]
2011-08-25 00:12
232 查看
思路:
最短路入门题。
很久前做的题目,今天重写了一下,算是复习了一下最短路,整理一下spfa代码模板和dijstra+heap的代码。
SPFA:32ms
dijstra+head:16ms
最短路入门题。
很久前做的题目,今天重写了一下,算是复习了一下最短路,整理一下spfa代码模板和dijstra+heap的代码。
SPFA:32ms
#include<iostream> #include<vector> #include<string> #include<queue> #include<algorithm> #define llong long long #define Abs(a) ((a)>0?(a):-(a)) #define Mod(a,b) (((a)-1+(b))%(b)+1) using namespace std; const int N=1005; const int M=2005; const int inf=(1<<29); int n,m; int d ; struct { int v,w,next; }edge[2*M]; int edgehead ; int k; bool vis ; void addedge(int u,int v,int w) { edge[k].next=edgehead[u]; edge[k].w=w; edge[k].v=v; edgehead[u]=k++; } int spfa(int s) { queue<int> que; for(int i=1;i<=n;i++) d[i]=inf; d[s]=0; memset(vis,0,sizeof(vis)); que.push(s); while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=false; for(int i=edgehead[u];i;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(d[v]>d[u]+w) { d[v]=d[u]+w; if(!vis[v]) { que.push(v); vis[v]=true; } } } } return d ; } int main() { scanf("%d%d",&m,&n); int u,v,w; k=1; for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); } printf("%d\n",spfa(1)); return 0; }
dijstra+head:16ms
#include<iostream> #include<vector> #include<string> #include<queue> #include<algorithm> #define llong long long #define Abs(a) ((a)>0?(a):-(a)) #define Mod(a,b) (((a)-1+(b))%(b)+1) using namespace std; const int N=1005; const int M=2005; const int inf=(1<<29); int n,m; int d ; struct { int v,w,next; }edge[2*M]; int edgehead ; int k; bool vis ; void addedge(int u,int v,int w) { edge[k].next=edgehead[u]; edge[k].w=w; edge[k].v=v; edgehead[u]=k++; } struct cmp { bool operator ()(const int a,const int b) { return d[a]>d[b]; } }; int dijstra(int s) { priority_queue<int,vector<int>,cmp> que; for(int i=1;i<=n;i++) d[i]=inf; d[s]=0; memset(vis,0,sizeof(vis)); que.push(1); while(!que.empty()) { int u=que.top(); que.pop(); if(vis[u])//这行代码去除之后时间居然变成0ms,有点郁闷。 continue; vis[u]=true; for(int i=edgehead[u];i;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(!vis[v]&&d[v]>d[u]+w) { d[v]=d[u]+w; que.push(v); } } } return d ; } int main() { scanf("%d%d",&m,&n); int u,v,w; k=1; for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); } printf("%d\n",dijstra(1)); return 0; }
相关文章推荐
- POJ1511 Invitation Cards [最短路,dijstra+heap,spfa]
- HDU2112 最短路入门题 spfa
- POJ3635 周游诸城:变形的SPFA/Dijkstra最短路+动规思想+Heap
- SPFA入门题-----hdu2544最短路
- 最短路Floyd(hdu1874),dijstra(poj2387)
- 【模板】【最短路】【Dijkstra+Heap,SPFA】
- POJ---2449 Remmarguts' Date[K短路入门题(Dijkstra()||Spfa()+A*)]
- 单源最短路-SPFA(poj2387)
- [面试] BFS、Dijstra、SPFA、Floyd求最短路的比较
- POJ 2253 - 最短路变形 SPFA+Dijstra
- hdu 1535 || poj 1511 Invitation Cards(heap + dijstra || spfa)
- POJ2387 Til the Cows Come Home(dijkstra + heap 或 SPFA)
- HDU - 6166 SPFA最短路次短路 or 二进制+Dijstra
- 2013成都邀请赛J题||HDU4725 The Shortest Path in Nya Graph(spfa+slf优化最短路)
- 第一周---最短路(Dijkstra、SPFA)
- HDU 2544 最短路 SPFA 邻接表 模板
- 最短路之SPFA模板
- poj2449 Remmarguts' Date --- k短路模板(SPFA+A*)
- POJ3259 Wormholes(最短路,有无负环,spfa,模板)
- HDU 2544-最短路(SPFA,Dijkstra,Floyd)