hdu3592差分约束
题意:如果i和j之间是喜欢关系,那么它们最多相距w;如果不喜欢就最少要相距w。
可以转换成求最短路,spfa算法,如果是负环就输出-1;
如果图不连通就输出-1;否则输出最短路。
#include<iostream> #include<queue> #include<cmath> using namespace std; const int N=1003; const __int64 inf=1000000000000; int head[N],vis[N],in[N]; __int64 dis[N]; struct node { int v,w,next; }e[N*20]; int n,tot; void add(int a,int b,int w) { e[tot].v=b; e[tot].w=w; e[tot].next=head[a]; head[a]=tot++; } void spfa() { int i; queue<int>q; for(i=0;i<=n;i++) { dis[i]=inf; vis[i]=0; in[i]=0; } in[1]=1; dis[1]=0; vis[1]=1; q.push(1); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(i=head[u];i+1;i=e[i].next) { int v=e[i].v; __int64 w=dis[u]+e[i].w; if(dis[v]>w) { dis[v]=w; if(!vis[v]) { vis[v]=1; if(++in[v]>(int)sqrt(n*1.0)) { printf("-1\n"); return ; } q.push(v); } } } } if(dis[n]<inf) printf("%I64d\n",dis[n]); else printf("-2\n"); } int main() { int y,x,i,t,a,b,w; scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head)); tot=0; scanf("%d%d%d",&n,&x,&y); for(i=0;i<x;i++) { scanf("%d%d%d",&a,&b,&w); add(a,b,w); } for(i=0;i<y;i++) { scanf("%d%d%d",&a,&b,&w); add(b,a,-w); } spfa(); } return 0; }