Codeforces 20C Dijkstra?
2013-01-31 20:59
411 查看
题意很简单,就是普通的求1到N 的最短路径,但是数据比较大,N<=100000,M<=100000,W<=1000000,最大程度可能为1e11。如果用简单的裸Dijsktra(o(n^2))必定超时,所以要用堆优化。这里我也是复习了一下二叉堆的一些知识。
http://www.nocow.cn/index.php/Dijkstra%E7%AE%97%E6%B3%95可以到这个网站上学习一下
http://www.nocow.cn/index.php/Dijkstra%E7%AE%97%E6%B3%95可以到这个网站上学习一下
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> using namespace std; const int MAXE=200010; const int MAXN=100005; const __int64 INF=1000000000000; struct node { node *next; int to,w; }edge[MAXE]; struct HeapElement { int key; __int64 value; }; struct MinHeap { HeapElement H[MAXN]; int size; int Position[MAXN]; void init(){H[size=0].value=-INF;} void ins(int key,__int64 value) { int i,f; HeapElement p={key,value}; for (i=++size;p.value<H[f=i>>1].value;i=f) { H[i]=H[f]; Position[H[i].key]=i; } H[i]=p; Position[H[i].key]=i; } void decrease(int key,__int64 value) { int i,f; HeapElement p={key,value}; for (i=Position[key];p.value<H[f=i>>1].value;i=f) { H[i]=H[f]; Position[H[i].key]=i; } H[i]=p; Position[H[i].key]=i; } void delmin() { int i,c; HeapElement p=H[size--]; for (i=1;(c=i<<1)<=size;i=c) { if (c+1<=size && H[c+1].value<H[c].value) c++; if (H[c].value<p.value) { H[i]=H[c]; Position[H[i].key]=i; } else break; } H[i]=p; Position[H[i].key]=i; } }H; int n,m,sume,pre[MAXN],ans[MAXN]; __int64 dis[MAXN]; node *head[MAXN]; inline void addedge(int a,int b,int c) { edge[++sume].next=head[a]; edge[sume].to=b;edge[sume].w=c; head[a]=&edge[sume]; } void init() { int a,b,d; sume=-1; memset(head,NULL,sizeof(head)); scanf("%d%d",&n,&m); while(m--) { scanf("%d%d%d",&a,&b,&d); addedge(a,b,d); addedge(b,a,d); } } void Dijkstra(int start) { int i,j; dis[start]=0; H.decrease(start,0); for (i=start;;) { H.delmin(); for (node *k=head[i];k!=NULL;k=k->next) { if (dis[i]+k->w<dis[j=k->to]) { dis[j]=dis[i]+k->w; H.decrease(j,dis[j]); pre[j]=i; } } if (H.size) i=H.H[1].key; else break; } } void solve() { int i,j; H.init(); for (j=1;j<=n;j++) { H.ins(j,INF); dis[j]=INF; pre[j]=1; } Dijkstra(1); if(dis <INF) { int x=n; int p=0; do { ans[p++]=x; x=pre[x]; }while(x!=1); printf("1"); for(i=p-1;i>=0;i--) printf(" %d",ans[i]); printf("\n"); } else puts("-1"); } int main() { init(); solve(); return 0; }
相关文章推荐
- CodeForces 【20C】Dijkstra?
- CodeForces 20C Dijkstra?
- 【Codeforces 20C】 Dijkstra?
- CodeForces 20C Dijkstra? (最短路)
- codeforces 20C Dijkstra?
- cf 20C Dijkstra?
- 20c Dijkstra?
- CodeForces 601A The Two Routes(dijkstra最短路)——Codeforces Beta Round #333 (Div.1 Div. 2)
- CodeForces 715B Complete The Graph(Dijkstra)
- Codeforces 715B Complete The Graph(dijkstra+heap)
- Yaroslav and Time - CodeForces 301B Dijkstra
- Codeforces 567E President and Roads (用Dijkstra求最短路条数 + 强连通桥)
- CodeForces - 715 B. Complete The Graph(dijkstra+暴力)
- CodeForces - 938D Buy a Ticket [Dijkstra]
- Codeforces Alpha Round #20 (Codeforces format) C. Dijkstra?(裸的dijkstra)
- Codeforces 144D. Missile Silos【dijkstra】
- Codeforces 601A Dijkstra最短路
- Codeforces Alpha Round #20 (Codeforces format) C. Dijkstra?(裸的dijkstra)
- codeforces 20 C Dijkstra? spfa
- codeforces 938D Buy a Ticket 有初值的Dijkstra、有趣的题目