hdu 3592 World Exhibition

来源:互联网 发布:软件商业计划书模板 编辑:程序博客网 时间:2024/06/03 20:41

用最短路进行差分约束,注意当n不能到达时输出-2;

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<queue>using namespace std;struct pi{    int no,to,cost,next;}pp[20005];int head[1005],vis[1005],tot;long long dis[1005],aa[1005];void add(int a,int b,int cost){    pp[tot].no=a;    pp[tot].to=b;    pp[tot].cost=cost;    pp[tot].next=head[a];    head[a]=tot++;    return ;}queue<int >q;int main(){    int i,n,m,p,k,t,f,v,flag;    cin>>t;    while(t--)    {        cin>>n>>m>>p;        memset(head,-1,sizeof(head));        tot=0;        for(i=1;i<=n;i++){            dis[i]=100000000000;            vis[i]=0;            aa[i]=0;        }        for(i=0;i<m;i++){            scanf("%d%d%d",&k,&f,&v);            if(k>f)            swap(k,f);            add(k,f,v);        }        for(i=0;i<p;i++){            scanf("%d%d%d",&k,&f,&v);            if(k>f)            swap(k,f);            add(f,k,-v);        }        for(i=1;i<n;i++)            add(i+1,i,-1);        dis[1]=0;        vis[1]=1;        while(!q.empty())            q.pop();        q.push(1);        flag=0;        while(!q.empty())        {            p=q.front();            q.pop();            vis[p]=0;            aa[p]++;            for(i=head[p];i!=-1;i=pp[i].next){                if(dis[pp[i].to]>dis[p]+pp[i].cost){                    dis[pp[i].to]=dis[p]+pp[i].cost;                    if(!vis[pp[i].to]){                        vis[pp[i].to]=1;                        q.push(pp[i].to);                    }                }            }            if(aa[p]>=n){                flag=1;                break;            }        }        if(flag){            printf("-1\n");        }        else if(dis[n]<dis[1]||dis[n]>=1000000000)            printf("-2\n");        else            printf("%lld\n",dis[n]-dis[1]);    }    return  0;}


0 0