AtCoder Regular Contest 090 D

 D - People on a Line

Problem Statement

There are N people standing on the x-axis. Let the coordinate of Person i be xi. For every i, xi is an integer between 0 and 109 (inclusive). It is possible that more than one person is standing at the same coordinate.

You will given M pieces of information regarding the positions of these people. The i-th piece of information has the form (Li,Ri,Di). This means that Person Ri is to the right of Person Li by Di units of distance, that is, xRixLi=Di holds.

It turns out that some of these M pieces of information may be incorrect. Determine if there exists a set of values (x1,x2,…,xN) that is consistent with the given pieces of information.

Constraints

  • 1≤N≤100 000
  • 0≤M≤200 000
  • 1≤Li,RiN (1≤iM)
  • 0≤Di≤10 000 (1≤iM)
  • LiRi (1≤iM)
  • If ij, then (Li,Ri)≠(Lj,Rj) and (Li,Ri)≠(Rj,Lj).
  • Di are integers.

Input

Input is given from Standard Input in the following format:

N M
L1 R1 D1
L2 R2 D2
:
LM RM DM

Output

If there exists a set of values (x1,x2,…,xN) that is consistent with all given pieces of information, print Yes; if it does not exist, print No.


Sample Input 1

Copy
3 3
1 2 1
2 3 1
1 3 2

Sample Output 1

Copy
Yes

Some possible sets of values (x1,x2,x3) are (0,1,2) and (101,102,103).


Sample Input 2

Copy
3 3
1 2 1
2 3 1
1 3 5

Sample Output 2

Copy
No

If the first two pieces of information are correct, x3x1=2 holds, which is contradictory to the last piece of information.


Sample Input 3

Copy
4 3
2 1 1
2 3 5
3 4 2

Sample Output 3

Copy
Yes

Sample Input 4

Copy
10 3
8 7 100
7 9 100
9 8 100

Sample Output 4

Copy
No

Sample Input 5

Copy
100 0

Sample Output 5

Copy
Yes


题意:给定有N个人,M条信息。每条信息:L,R,D,表示第R个人在第L个人的右边距离为D。求根据这M条信息判断安排是否成立。
题解:本来以为可以在线一条一条输入输入信息的同时判断是否合法,好像是不可以。答案说是构成图,然后DFS每一个节点。
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<cstdio>
 6 using namespace std;
 7 const int maxn = 1e5 + 100;
 8 typedef long long ll;
 9 vector<pair<int, int> > e[maxn];
10 ll dis[maxn];
11 bool vis[maxn];
12 int n, m,flag=0;
13 
14 void dfs(int x)
15 {
16     vis[x] = 1;
17     for (int i = 0; i < e[x].size(); i++)
18     {
19         pair<int, int> cur=e[x][i];
20         if (vis[cur.first]) {
21             if (dis[cur.first] - dis[x] != cur.second) {
22                 flag = 1; break;
23             }
24         }
25         else {
26             dis[cur.first] = dis[x] + cur.second;
27             dfs(cur.first);
28         }
29     }
30 }
31 
32 int main()
33 {
34     cin >> n >> m;
35     memset(vis, 0, sizeof(vis));
36     for (int i = 0; i < m; i++) {
37         int l, r, d;
38         cin >> l >> r >> d;
39         e[l].push_back({ r,d });
40         e[r].push_back({ l,-d });
41     }
42     flag = 0;
43     for (int i = 0; i <n; i++) {
44         if (!vis[i]) 
45             dfs(i);
46         if (flag) {
47             break;
48         }
49     }
50     if (flag) {
51         cout << "No" << endl;
52     }
53     else
54         cout << "Yes" << endl;
55     return 0;
56 }


原文地址:https://www.cnblogs.com/zxhyxiao/p/8393077.html