poj 3169 Layout (spfa + 查分约束)

和 poj  3159 相似 :

建图 时 多 b-a>=c 这种情况,对于建图时用虚拟节点 不是太懂

#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf 999999999
#define V 1001
#define E 20001
int pnt[E],cost[E],nxt[E],e;
int head[V],dist[V],vis[V],cnt[V];
void add(int u,int v,int c)
{
    pnt[e]=v;cost[e]=c;nxt[e]=head[u];head[u]=e++;
}
int spfa(int s,int n)
{
    for(int i=1;i<=n;i++)
    vis[i]=0,cnt[i]=0,dist[i]=inf;
    vis[s]=1,cnt[s]++,dist[s]=0;

    queue <int> p; p.push(s);
    while(!p.empty())
    {
        int u=p.front();
        vis[u]=0;p.pop();
        for(int i=head[u];i!=-1;i=nxt[i])
        {
            int v=pnt[i];
            if(dist[v]>dist[u]+cost[i])
            {
                dist[v]=dist[u]+cost[i];
                if(!vis[v])
                {
                    vis[v]=1;
                    p.push(v);
                    if((++cnt[v])>=n) return -1;
                }
            }
        }
    }
    if(dist[n]==inf) return -2;
    return dist[n];
}
int main()
{
    int n,ml,md;
    while(scanf("%d%d%d",&n,&ml,&md)!=EOF)
    {
        e=0;memset(head,-1,sizeof(head));
        while(ml--)
        {
           int u,v,c;cin>>u>>v>>c;
           //if(u>v) swap(u,v);
           add(u,v,c);
        }
        while(md--)
        {
            int u,v,c;cin>>u>>v>>c;
           // if(u<v) swap(u,v);
            add(v,u,-c);
        }
        /*for(int i=2;i<=n;i++)
        add(i,1,0);*/
        cout<<spfa(1,n)<<endl;
    }
    return 0;
}
posted @ 2012-05-04 10:34  skyming  阅读(208)  评论(0编辑  收藏  举报