HDU - 6252 差分約束
阿新 • • 發佈:2018-11-25
好菜啊不會啊,每條訊息給出了其實就是d-a>=x+1,c-b<=x-1,b-c>=-x+1,然後跑spfa跑一遍最長路,注意判斷正環,如果a=b,c=d的話,那麼c-a=x,也就是d-a>=x,c-b>=x。
#include<bits/stdc++.h> #define maxl 2010 #define inf 2000000001 using namespace std; int n,m,x,cas,cnt; int ehead[maxl],dis[maxl],vis[maxl]; struct ed { int to,nxt,l; }e[maxl*maxl*2]; bool flag,in[maxl]; queue <int> q; inline void add(int u,int v,int l) { e[++cnt].to=v;e[cnt].nxt=ehead[u];e[cnt].l=l;ehead[u]=cnt; } inline void prework() { scanf("%d%d%d",&n,&m,&x); for(int i=1;i<=n;i++) ehead[i]=0; cnt=0; for(int i=1;i<n;i++) add(i,i+1,1); int tmp,a,b,c,d; for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); tmp=0; if(a!=b || c!=d) tmp=1; add(a,d,x+tmp); add(c,b,-x+tmp); } } inline void mainwork() { int u,v; for(int i=1;i<=n;i++) dis[i]=-inf,in[i]=false,vis[i]=0; while(!q.empty()) q.pop(); q.push(1);in[1]=true;vis[1]=1;dis[1]=0; flag=true; while(!q.empty()) { u=q.front();q.pop();in[u]=false; for(int i=ehead[u];i;i=e[i].nxt) { v=e[i].to; if(dis[v]<dis[u]+e[i].l) { dis[v]=dis[u]+e[i].l; if(!in[v]) { q.push(v); vis[v]++; if(vis[v]>=n) { flag=false; return; } in[v]=true; } } } } } inline void print() { if(dis[n]>inf || !flag) printf("Case #%d: IMPOSSIBLE\n",cas); else { printf("Case #%d:",cas); for(int i=2;i<=n;i++) printf(" %d",dis[i]-dis[i-1]); putchar('\n'); } } int main() { int t; scanf("%d",&t); for(cas=1;cas<=t;cas++) { prework(); mainwork(); print(); } return 0; }