http://acm.hdu.edu.cn/showproblem.php?pid=6252
好菜啊不会啊,每条消息给出了其实就是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;
}