USACO 2010 Feb Chocolate Giving 领取巧克力

来源:互联网 发布:用ss网络会不会被监控 编辑:程序博客网 时间:2024/04/26 03:34

这道题其实就是堆优化的Dijkstra。不用堆优化的话是会超时的。

#include<cstdio>#include<cstdlib>#define PROBNAME "cgiving"const int MAXN=50000;const int MAXM=100000;const int MAXB=25000;const int INF=2000*MAXN*2+1;int n,m,b;int k,first[MAXN+2],next[MAXM*2+10],head[MAXM*2+10],tail[MAXM*2+10],c[MAXM*2+10];int q[MAXN+2],rd[MAXN+2],size;int d[MAXN+2];void open_file(void){freopen(PROBNAME".in","r",stdin);freopen(PROBNAME".out","w",stdout);}int getint(void){int a;scanf("%d",&a);return a;}void addedge(int u,int v,int w){k++;next[k]=first[u];first[u]=k;head[k]=u;tail[k]=v;c[k]=w;}void init(void){n=getint();m=getint();b=getint();for(int i=1;i<=m;i++){int r=getint(),s=getint(),l=getint();addedge(r,s,l);addedge(s,r,l);}}void swap(int i, int j) {  int u = q[i];  int v = q[j];  rd[u] = j;  rd[v] = i;  q[i] = v;  q[j] = u;}void up(int i){int j=i/2;if(j>0&&d[q[i]]<d[q[j]]){swap(i,j);up(j);}}void down(int i){int j=i*2;if(j+1<=size&&d[q[j]]>d[q[j+1]])j++;if(j<=size&&d[q[i]]>d[q[j]]){swap(i,j);down(j);}}void push(int x){q[++size]=x;rd[x]=size;up(size);}void pop(void){swap(1,size--);down(1);}void dijkstra(void){for(int i=2;i<=n;i++){d[i]=INF;}for(int i=1;i<=n;i++){push(i);}while(size){int u=q[1];pop();for(int e=first[u];e;e=next[e]){int v=tail[e];if(d[v]>d[u]+c[e]){d[v]=d[u]+c[e];up(rd[v]);}}}}void solve(void){dijkstra();}void output(void){for(int i=1;i<=b;i++){int p=getint(),q=getint();printf("%d\n",d[p]+d[q]);}}void close_file(void){fclose(stdin);fclose(stdout);}int main(){open_file();init();solve();output();close_file();return 0;}


0 0