POJ 3159 松弛操作 差分约束 SPFA

来源:互联网 发布:工信部域名备案查询 编辑:程序博客网 时间:2024/05/10 01:20

这个题的数据比较奇葩  SPFA里必须拿栈才能过,队列就过不了,而且在建图的时候最好不要拿vector也好像会超时,比较尴尬。

#include<cstdio>#include<cstring>#include<algorithm>#include<stack>#include<vector>#include<queue>using namespace std;const int maxn=150010;const int INF=0x3f3f3f3f;int n,m,u,v,w,d[30010],vis[30010],Q[30010];struct Edge{    int v,w,nexts;}edge[maxn];int head[30010];int cnt;void init(){    cnt=0;    memset(head,-1,sizeof(head));   memset(vis,0,sizeof(vis));   memset(d,0,sizeof(d));   memset(Q,0,sizeof(Q));}void add_edge(int u,int v,int w){    Edge p;    p.v=v;    p.w=w;    p.nexts=head[u];   edge[cnt]=p;   head[u]=cnt++;}bool SPFA(int start,int end){    int top=0;    for(int i=1;i<=n;i++)    {        if(i==start)        {            Q[top++]=i;            vis[i]=true;            d[i]=0;        }        else        {            vis[i]=false;            d[i]=INF;        }    }    while(top)    {     int u=Q[--top];     vis[u]=0;     for(int i=head[u];i!=-1;i=edge[i].nexts)     {        int v=edge[i].v;        int w=edge[i].w;         if(d[v]>d[u]+w)        {            d[v]=d[u]+w;            if(!vis[v])            {                vis[v]=1;                Q[top++]=v;            }        }     }    }     return true;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        init();     for(int i=1;i<=m;i++)     {          scanf("%d%d%d",&u,&v,&w);           add_edge(u,v,w);     }        SPFA(1,n);      printf("%d\n",d[n]);    }    return 0;}


0 0
原创粉丝点击