【差分约束系统/SPFA】POJ3169-Layout

【题目大意】

n头牛从小到大排,它们之间某些距离不能大于一个值,某些距离不能小于一个值,求第一头牛和第N头牛之间距离的最大值。

【思路】

由题意可以得到以下不等式d[AL]+DL≥d[BL];d[BD]+(-DD)≥d[AD];d[i+1]+0≥d[i],显然是差分约束系统。即构造从AL到BL权值为DL的边,从BD到AD构造权值为-DD的负边,从i+1到i构造权值为0的边。最后求最短路径。安利一个证明(点我)。

对于差分约束系统要注意的是,如果要求最大距离,用最短路径;求最小距离,用最长路径,要根据实际情况判断。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAXN=100000+5;
 6 struct Rec
 7 {
 8     int ori,des,len;
 9     bool operator < (const Rec &x) const
10     {
11         return len>x.len;
12     }
13 }edge[MAXN*5];
14 int par[MAXN*2],height[MAXN*2];
15 int n,m,r;
16 /*n代表女兵,m代表男兵,这里不需要用到二分图;r代表关系数*/
17 int ans;
18
19 void initset()
20 {
21     for (int i=0;i<(n+m);i++)
22     {
23         par[i]=i;
24         height[i]=0;
25     }
26 }
27
28 int find(int x)
29 {
30     int r=x,temp;
31     while (par[r]!=r) r=par[r];
32     while (x!=r)
33     {
34         temp=par[x];
35         par[x]=r;
36         x=temp;
37     }
38     return (r);
39 }
40
41 void unionset(int fa,int fb)
42 {
43     if (height[fa]>=height[fb])
44     {
45         par[fb]=fa;
46         if (height[fa]==height[fb]) height[fa]++;
47     }
48     else
49         par[fa]=fb;
50 }
51
52 int main()
53 {
54     int kase;
55     scanf("%d",&kase);
56     for (int cases=0;cases<kase;cases++)
57     {
58         scanf("%d%d%d",&n,&m,&r);
59         int ans=10000*(m+n);
60         for (int i=0;i<r;i++)
61         {
62             int u,v,w;
63             scanf("%d%d%d",&u,&v,&w);
64             edge[i].ori=u;
65             edge[i].des=v+n;
66             edge[i].len=w;
67         }
68         sort(edge,edge+r);
69         initset();
70         for (int i=0;i<r;i++)
71         {
72             int fa=find(edge[i].ori);
73             int fb=find(edge[i].des);
74             if (fa!=fb)
75             {
76                 unionset(fa,fb);
77                 ans-=edge[i].len;
78             }
79         }
80         cout<<ans<<endl;
81     }
82     system("pause");
83     return 0;
84 }
时间: 2024-10-12 04:55:44

【差分约束系统/SPFA】POJ3169-Layout的相关文章

UVa 515 - King (差分约束系统 + SPFA求带负权最短路)

下面是差分约束系统的详细介绍,以及解决方法~ 摘抄自 xuezhongfenfei(他好像也是转的....) 差分约束系统 X1 - X2 <= 0 X1 - X5 <= -1 X2 - X5 <= 1 X3 - X1 <= 5 X4 - X1 <= 4 X4 - X3 <= -1 X5 - X3 <= -3 X5 - X4 <= -3 不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于).这样的不等式组

ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)

当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题 ZOJ2770-Burn the Linked Camp //差分约束方程组-转换为最短路问题 //d[v] <= d[u] + dis[u][v] -> d[v] - d[u] <= dis[u][v] //Time:110Ms Memory:12116 #include<iostream> #include<cstring> #inc

POJ3169 Layout【SPFA】【差分约束】

Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7608 Accepted: 3653 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a str

POJ 3169 Layout (差分约束+SPFA)

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6832   Accepted: 3292 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a

POJ 3169 Layout(差分约束系统)

题目链接:http://poj.org/problem?id=3169 题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有ML组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 <= w.2.有MD组(u, v, w)的约束关系,表示牛[u]和牛[v]之间的距离必须 >= w.问如果这n头无法排成队伍,则输出-1,如果牛[1]和牛[n]的距离可以无限远,则输出-2,否则则输出牛[1]和牛[n]之间的最

poj3169 差分约束系统

题意: 从1到n,n个数,从左向右一次排列.给定两种形式的约束条件: 1.xi与yi的最大距离为dk 2.xi与yi的最小距离为dk 问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条件相互矛盾则输出-1,若最大距离可以为无穷大则输出-2) 知识补充: 差分约束系统的概念:由n个变量和m个约束条件(实数)组成,且都是形如: xi?yj≤bk(x,y为变量,b为实数) 的形式. 用Bellman-Ford算法求解差分约束系统:由于最短路三角不等式:d[v]?d[u]≤e[u,v]与差

POJ3169差分约束系统

题意:有n头牛,编号为1到n,对于关系好的ml头牛,al和bl之间的距离不大于dl,关系差的md头牛,ad和bd之间的距离不大于dd,求第1头牛和第n头牛之间的距离 分析:这是一道差分约束系统的题目,先来看一下查分约束系统的资料 http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 于是上述问题可以转换成最短路问题来求解,设d[i]为第1个顶点到第i个顶点的最短距离,d[al[i]]+dl[i]>=d[bl[i]],于是d[bl[

POJ3169:Layout(差分约束)

http://poj.org/problem?id=3169 题意: 一堆牛在一条直线上按编号站队,在同一位置可以有多头牛并列站在一起,但编号小的牛所占的位置不能超过编号大的牛所占的位置,这里用d[i]表示编 号为i的牛所处的位置,即要满足d[i]-d[i+1]<=0,同时每两头牛之间有以下两种关系(对于输入的a b d来说):             1>如果是喜欢关系:即需要满足d[b]-d[a]<=d             2>如果是讨厌关系:即需要满足d[b]-a[a]&

浅谈差分约束系统——图论不等式的变形

浅谈差分约束系统——图论不等式的变形 ----yangyaojia 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 一.定义 如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统. 二.分析 简单来说就是给你n个变量,给m个形如x[i]-x[j]≥k①或x[i]-x[j]≤k②.求两