Codeforces 20C Dijkstra?
来源:互联网 发布:万网域名指向花生壳 编辑:程序博客网 时间:2024/05/23 11:44
题意很简单,就是普通的求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可以到这个网站上学习一下
#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;}elsebreak;}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;elsebreak;}}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[n]<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 Alpha Round #20 (Codeforces format) C. Dijkstra?(裸的dijkstra)
- Codeforces Alpha Round #20 C. Dijkstra?(优先队列优化)
- codeforces 20 c 堆优化dijkstra + 路径打印
- CF 20C Dijkstra?
- CodeForces 20C
- dijkstra算法 c语言
- Dijkstra算法函数(c++)
- C++Dijkstra算法实现
- Yaroslav and Time - CodeForces 301B Dijkstra
- Codeforces 144D. Missile Silos【dijkstra】
- codeforces 507E (dijkstra+优先队列)
- Codeforces 601A Dijkstra最短路
- CodeForces 601A (dijkstra算法)
- Dijkstra改进算法C语言
- c语言 dijkstra算法 交通图
- hdu 2818 Building Block(并查集,输出一元素下边有多少)
- 加速Web开发的9款知名HTML5框架
- static 在c和c++
- ubuntu下中文乱码解决方案(全)
- PostgreSQL学习笔记1之表定义
- Codeforces 20C Dijkstra?
- 用C语言编写可移植程序的注意事项
- UnsupportedClassVersionError: Bad version number in .class file 解决方案
- EZ-USB 68013在WIN7 64位下驱动识别方法
- Yii中的relations方法
- c#泛型继承的里氏原则问题
- PhoneGap之iOS端安装
- VS2005(VS2008)与VC6.0的几点区别
- 解决Jenkins分布式编译iOS代码时,出现"User interaction is not allowed"