POJ 2983 Is the Information Reliable? 信息可靠吗 (差分约束,spfa)

题意:有n个站排成一列,针对每个站的位置与距离关系,现有多个约束条件,约束条件分两种:(1)确定的。明确说明站a距离站b多少个单位距离。(2)不确定的。只知道a在b的左边至少1个单位距离。  根据已知条件,问有没有冲突?不冲突则输出reliable。

思路:

  第2种条件比较好确定,如果知道如何用最短路解差分约束的话。

  问题在第1种,明确地说明了距离,怎么办?拆成两条式子,比如 dis(a,b)=c,那么可以写成 b-a>=c ,b-a<=c 这样,只要满足这两个条件,原来明确说明的距离也会成立的。这样就可以根据两条式子建图了。再用spfa解就可以了。

 1 //#include <bits/stdc++.h>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <cstring>
 6 #include <deque>
 7 #define INF 0x7f7f7f7f
 8 #define pii pair<int,int>
 9 #define LL unsigned long long
10 using namespace std;
11 const int N=1010;
12 struct node
13 {
14     int from, to, cost;
15     node(){};
16     node(int from,int to,int cost):from(from),to(to),cost(cost){};
17 }edge[N*N];
18 int edge_cnt;
19 vector<int> vect[N];
20
21 void add_node(int from,int to,int cost)
22 {
23     edge[edge_cnt]=node(from, to, cost);
24     vect[from].push_back(edge_cnt++);
25 }
26
27 int inq[N], cost[N], cnt[N];
28
29 bool spfa(int n)
30 {
31     memset(inq, 1, sizeof(inq));
32     memset(cost, 0, sizeof(cost));
33     memset(cnt, 0, sizeof(cnt));
34     deque<int> que;
35     for(int i=1; i<=n; i++) que.push_back(i);
36
37     while(!que.empty())
38     {
39         int x=que.front();
40         que.pop_front();
41         inq[x]=0;
42         for(int i=0; i<vect[x].size(); i++)
43         {
44             node e=edge[vect[x][i]];
45             if(cost[e.to]>cost[e.from]+e.cost)
46             {
47                 cost[e.to]=cost[e.from]+e.cost;
48                 if(!inq[e.to])
49                 {
50                     inq[e.to]=1;
51                     if(++cnt[e.to]>n)   return false;
52                     if(!que.empty()&& cost[e.to]<cost[que.front()])
53                         que.push_front(e.to);
54                     else
55                         que.push_back(e.to);
56                 }
57             }
58         }
59     }
60     return true;
61 }
62
63 int main()
64 {
65     freopen("input.txt", "r", stdin);
66     int t, a, b, d, n, m;
67     char c;
68     while(~scanf("%d%d", &n, &m))
69     {
70         edge_cnt=0;
71         for(int i=0; i<=n; i++) vect[i].clear();
72         memset(edge,0,sizeof(edge));
73
74         for(int i=0; i<m; i++)
75         {
76             while(scanf("%c", &c), !isalpha(c) );
77             if(c==‘P‘)//确定的,要拆
78             {
79                 scanf("%d %d %d", &a, &b, &d);
80                 add_node(a,b,d);
81                 add_node(b,a,-d);
82             }
83             else
84             {
85                 scanf("%d %d", &a, &b);
86                 add_node(b,a,-1);
87             }
88         }
89         if(spfa(n)) puts("Reliable");
90         else    puts("Unreliable");
91     }
92     return 0;
93 }

AC代码

时间: 2024-10-03 10:25:00

POJ 2983 Is the Information Reliable? 信息可靠吗 (差分约束,spfa)的相关文章

POJ 2983 Is the Information Reliable?

/* *POJ 2983 Is the Information Reliable? *差分约束系统 *(1)对于确定信息 P A B X, 有 A - B >= X && A - B <= X 即 B <= A + (-X) && A <= B + X * 即构成边<A, B, -X> 和 <B, A, X> *(2)对于不确定信息 V A B, 有 A - B >= 1, 即 B <= A + (-1) * 即构

POJ 2983 Is the Information Reliable? 差分约束

裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath> #include<

POJ 2983 Is the Information Reliable?(差分约束系统)

题目地址:POJ 2983 这题刚上来完全不知道跟差分约束系统有什么关系.....后来发现只要判个负环就可以.. 因为假如有冲突的话会形成一个负环.之所以建图加上一个正值一个负值,是因为这样的话,像1 2 4和1 2 3这样的数据就会形成一个负环.这个方法还是很巧妙的...然后对于V的那些不清楚的位置,就会跟P的那些等式联立形成一个不等式,然后在用最短路判环的过程中就用松弛来解决. 代码如下: #include <iostream> #include <cstdio> #inclu

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 题目2983 Is the Information Reliable?(差分约束)

Is the Information Reliable? Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 11859   Accepted: 3742 Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years ago. Draco established a line of defe

POJ训练计划2983_Is the Information Reliable?(差分约束)

解题报告 思路: 求解: p:a-b=x v:a-b>=1 的方程 #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define inf 0x3f3f3f3f using namespace std; struct node { int v,w,next; } edge[220000]; int head[1111],dis[1111],vis[111

POJ 3159 Candies(差分约束+spfa+链式前向星)

题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A的糖果数<=C . 最后求n 比 1 最多多多少颗糖果. 解题思路:经典差分约束的题目,具体证明看这里<数与图的完美结合——浅析差分约束系统>. 不妨将糖果数当作距离,把相差的最大糖果数看成有向边AB的权值,我们得到 dis[B]-dis[A]<=w(A,B).看到这里,我们可以联想到

POJ 1201 Intervals(差分约束+spfa 求最长路径)

题目链接:http://poj.org/problem?id=1201 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end points and integers c1, ..., cn from the standard input, com

poj 3159 candies (差分约束 spfa+stack)

http://poj.org/problem?id=3159 题意:一个班有n个人 每人分到若干糖果 且u的糖果数不能比v少w个 求第1个人与第n个人最大数量差 照着模板spfa+queue果断tle了 之后照着题解说的把queue改成stack就过了 但是还不明白为什么会快 而且如果用数组直接模拟会比stl更快 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>