POJ 3169 Layout 【差分约束系统 + 最短路模型】

传送门
// 有n头奶牛, 然后给出一些奶牛之间的必须从存在的一些距离限制, 问你是否有可能存在一种排列满足所给的限制条件. 如果有则输出1 - n 头奶牛最长的距离是多少. 如果不存在输出-1, 如果这个距离可以无限大, 则输出-2.

// 很明显的是差分约束的裸题, 我们用一个数轴来表示每一头奶牛, 那么对于第一种a b at most c , 就是dis[b] - dis[a] <= c, 也就是a -> b 有一条长度为c的路. 因为我们要求的是最大值, 即最短路, 所以所有的不等式应该都转化成 <= 的形式. 所以对于等二种我们转化为dis[b] - dis[a] >= c即dis[a] - dis[b] <= -c也就是b -> a有一条路径长度为-c的路径. 注意还有一个隐藏条件, 很多题如果不加上这些隐藏条件则会导致不可达的情况(虽然这道题不用加, 但是建议都加上.)
就是他们的位置不能重合, 即 dis[i] - dis[i-1] >= 1. 同理也要转化为 <= 的形式, 然后建图跑最短路即可, 注意判环.

AC Code

const int maxn = 1e4+5;
int n;
int head[maxn], cnt, dis[maxn];
bool vis[maxn];
int times[maxn];
struct node
{
    int to,next,w;
}e[maxn*3];
void add(int u, int v, int w)
{
    e[cnt] = (node){v,head[u],w};
    head[u] = cnt++;
}
bool spfa(int st,int ed)
{
    queue<int >q;
    dis[st]=0; vis[st] = true; times[st]++;
    q.push(st);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        vis[u] = false;
        for (int i = head[u]; ~i ; i = e[i].next) {
            int to = e[i].to;
            if(dis[to] > dis[u] + e[i].w){
                dis[to] = dis[u] + e[i].w;
                if(times[to] > n)
                    return false;
                else if(!vis[to]){
                    times[to]++;
                    vis[to] = true;
                    q.push(to);
                }
            }
        }
    }
    return true;
}
void solve()
{
    cnt = 0; Fill(head,-1); Fill(dis,inf);
    Fill(vis,0); Fill(times,0);
    int x,y;
    scanf("%d%d%d",&n,&x,&y);
    // 用这些点来表示数轴上的点, dis[i]表示i的距离.
    for (int i = 2 ; i <= n ; i ++) {
        add(i, i-1, -1);
    } // 隐藏的约束条件.
    for(int i = 1; i <= x ; i++ ) {
        int a, b, c; scanf("%d%d%d", &a, &b, &c);
        add(a, b, c);  //b - a <= c
    }
    for(int i = 1 ; i <= y ; i++) {
        int a,b,c; scanf("%d%d%d",&a,&b,&c);
        add(b, a, -c);  // b - a >= c   => a - b <= -c
    }
    if (!spfa(1, n)) printf("-1\n");        //有环是无解
    else{
        if(dis[n] == inf) printf("-2\n");  //到不了是多解,表示a和c没有关系
        else printf("%d\n",dis[n]);
    }
}

你可能感兴趣的:(差分约束系统)