POJ3169差分约束(SPFA+差分约束)

xiaoxiao2021-02-27  124

思路:

假设i<=j:

两只奶牛可以站在同一个位置,但是必须升序排列,所以有差分约束方程D[i] - D[i+1] <= 0;

对于两只有好感的奶牛有差分约束方程D[j] -D[i ]<= k;

对于两只反感的奶牛有差分约束方程D[i] - D[j] <= - k;

有了约束方程就可以spfa;

#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; const int MAX=0x3f3f3f3f,mx=1010; int n,ml,md,bb,h[mx],vis[mx],dis[mx],cen[mx]; struct{ int u,v,w,next; }edg[mx*mx]; void add(int u,int v,int w){ //edg[bb].u=u; edg[bb].v=v; edg[bb].w=w; edg[bb].next=h[u]; h[u]=bb++; } int spfa(){ memset(vis,0,sizeof(vis)); memset(dis,MAX,sizeof(dis)); memset(cen,0,sizeof(cen)); queue<int>q; q.push(1); dis[1]=0; while(!q.empty()){ int x=q.front(); q.pop(); vis[x]=0; for(int i=h[x];i!=-1;i=edg[i].next){ int v=edg[i].v; if(dis[v]>dis[x]+edg[i].w){ dis[v]=dis[x]+edg[i].w; if(!vis[v]){ vis[v]=1; q.push(v); if(++cen[v]>n) return -1; } } } } return 0; } int main(){ while(scanf("%d%d%d",&n,&ml,&md)!=EOF){ bb=0; memset(h,-1,sizeof(h)); int a,b,c; for(int i=0;i<ml;i++){ scanf("%d%d%d",&a,&b,&c); if(a>b) swap(a,b); add(a,b,c); } for(int i=0;i<md;i++){ scanf("%d%d%d",&a,&b,&c); if(a<b) swap(a,b); add(a,b,-c); } if(spfa()==-1) puts("-1"); else if(dis[n]==MAX) puts("-2"); else printf("%d\n",dis[n]); // cout<<n<<endl; } return 0; }

转载请注明原文地址: https://www.6miu.com/read-15694.html

最新回复(0)