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;}


原创粉丝点击