关于SPFA,记一点小悲催 poj 3159

来源:互联网 发布:安全知培训培训资料 编辑:程序博客网 时间:2024/06/03 17:41

一个作死的WA的代码

/*这题其实之前写个多个了,Dijkstra的,SPFA的,STL(TLE了)的,动态链表的,静态链表的,这次是想写一次数组模拟链表的没想到,意外差点让人亡if1 AC ,if2WA,苦逼了几个小时(各处查看好久才发现是这里不对劲),开始不对劲也没找到头路,之前因为直接写了relax()的函数,从没注意到有什么,归根结底对于松弛和入队的理解不够深刻啊,这是两个过程,我的if2显然是不能满足的,想偷懒省几行代码的,好吧,就这样苦逼的艰难前行好了*/#include<stdio.h>#include<string.h>const int V = 30001, E=150001;const int INF=0x3F3F3F3F;int d[V],n,m;int head[V],pnt[E],cost[E],nxt[E],e;void addedge(int u,int v,int c){    pnt[e]=v;    cost[e]=c;    nxt[e]=head[u];    head[u]=e++;}bool relax(int u,int v,int w){    if(d[v]>d[u]+w)    {        d[v]=d[u]+w;        return 1;    }    return 0;}int spfa(){    int Q[E],vis[V];    int i;    for(i=2;i<=n;++i)    {        d[i]=INF;        vis[i]=0;    }    vis[1]=1;    d[1]=0;    int top=1;    Q[0]=1;    int u,v,w;    while(top)    {        u=Q[--top];        vis[u]=0;        for(i=head[u];i!=-1;i=nxt[i])        {            v=pnt[i];            w=cost[i];           if((d[v]>w+d[u]) && !vis[v] )//if2           /// if(1 == relax(u,v,w) && !vis[v])//if1            {                d[v]=d[u]+w;                Q[top++]=v;                vis[v]=1;            }        }    }    return d[n];}int main(){    scanf("%d%d",&n,&m);    e=0;    int u,v,w;    int i = 0,res;    memset(head,-1,sizeof(head));    for(i = 0; i < m; ++ i)    {        scanf("%d%d%d",&u,&v,&w);        addedge(u,v,w);    }    res=spfa();    printf("%d ",res);    return 0;}


原创粉丝点击