poj 3159 SPFA+手写栈

来源:互联网 发布:阿里云服务器导入sql 编辑:程序博客网 时间:2024/05/21 17:36

一天啊  。。就挂在这道题上了。。。next数组开小了。。导致一直TLE。。服了我自己了。。T,T

题意:

    A小朋友不希望B小朋友比他多X块糖。。

SPFA+手写栈实现    队列会超时。。数据问题吧


#include<stdio.h>#define MX 100000000int pos,stack[150010],dist[30010],next[150010],list[30010],n,m;bool visit[30010];struct point{int u,v,w;}eg[150010];void add(int a,int b,int c){eg[pos].v=b;eg[pos].w=c;next[pos]=list[a];list[a]=pos++;}void SPFA(int v0){for(int i=1;i<=n;i++){visit[i]=0;dist[i]=MX;}visit[v0]=1;dist[v0]=0;stack[0]=v0;int top=1;while(top){int now=stack[--top];int p=list[now];while(p!=-1){if(eg[p].w+dist[now]<dist[eg[p].v]){dist[eg[p].v]=dist[now]+eg[p].w;if(!visit[eg[p].v]){stack[top++]=eg[p].v;visit[eg[p].v]=1;}//printf("p=%d t=%d dist[%d]=%d w=%d dist[%d]=%d\n",p,now,now,dist[now],eg[p].w,eg[p].v,dist[eg[p].v]);}p=next[p];}visit[now]=0;}}int main(){while(scanf("%d%d",&n,&m)!=EOF){pos=0;for(int i=0;i<=n;i++)list[i]=-1;for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);add(a,b,c);}SPFA(1);printf("%d\n",dist[n]);}return 0;}



原创粉丝点击