URAL 1701 Ostap and Partners(差统计量的并查集)
2012-04-29 19:07
295 查看
题目大意:
几个人在谈论他们的工资, 他会告诉你很多句话, 每句话是 a 比 b 多 c 块钱. 已知没有人的工资低于0或高于 10^9. 第一个人工资是0。 问从第几句话开始你可以判断有人在吹牛.如果没人吹牛输出每个人的工资。
解法:维护每个节点到根节点的差,判矛盾的方法类似于普通的种类并查集。最后还要判如果以上描述正确是否一定有人的工资超出了范围(这种矛盾只有可能在所有关系都给出后才能判断,中间无法判断)。因为第一个人的工资一定,因此会顶合并是总让标号小的做根节点,这样就可以固定第一个人的值。
几个人在谈论他们的工资, 他会告诉你很多句话, 每句话是 a 比 b 多 c 块钱. 已知没有人的工资低于0或高于 10^9. 第一个人工资是0。 问从第几句话开始你可以判断有人在吹牛.如果没人吹牛输出每个人的工资。
解法:维护每个节点到根节点的差,判矛盾的方法类似于普通的种类并查集。最后还要判如果以上描述正确是否一定有人的工资超出了范围(这种矛盾只有可能在所有关系都给出后才能判断,中间无法判断)。因为第一个人的工资一定,因此会顶合并是总让标号小的做根节点,这样就可以固定第一个人的值。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; public class OstapandPartners1701 { int p[], k[], min[]; int find(int x) { if (x == p[x]) return x; int temp = p[x]; p[x] = find(temp); k[x] += k[temp]; return p[x]; } boolean merge(int a, int b, int v) { int pa = find(a); int pb = find(b); if (pa == pb) return true; if (pa < pb) { int temp = pa; pa = pb; pb = temp; temp = a; a = b; b = temp; v = -v; } p[pa] = pb; k[pa] = v - k[a] + k[b]; return false; } StreamTokenizer in = new StreamTokenizer(new BufferedReader( new InputStreamReader(System.in))); final int next() throws IOException { in.nextToken(); return (int) in.nval; } void run() throws IOException { int n = next(); int m = next(); int inf = 1000000000; p = new int ; k = new int ; min = new int ; for (int i = 0; i < n; i++) p[i] = i; boolean flag = false; int a, b, v; for (int i = 1; i <= m; i++) { a = next(); b = next(); v = next(); if (flag) continue; if (merge(a, b, v) && k[a] - k[b] != v) { flag = true; System.out.println("Impossible after " + i + " statements"); } } if (flag) return; int res[] = new int ; for (int i = 0; i < n; i++) { int x = find(i); if (k[i] < min[x]) min[x] = k[i]; } for (int i = 0; i < n; i++) if (p[i] == i && min[i] < 0) res[i] = -min[i]; res[0] = 0; for (int i = 0; i < n; i++) { res[i] = res[p[i]] + k[i]; if (res[i] > inf || res[i] < 0) flag = true; } if (flag) System.out.println("Impossible after " + m + " statements"); else { System.out.println("Possible"); for (int i = 0; i < n; i++) System.out.println(res[i]); } } public static void main(String[] args) throws IOException { new OstapandPartners1701().run(); } }
相关文章推荐
- 1701. Ostap and Partners(并查集-关系)
- URAL_2032_Conspiracy Theory and Rebranding(暴力枚举)
- 【2-SAT】【并查集】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem
- Cycling Roads URAL 1966 线段相交 + 并查集
- ural 1809 Chapaev and Potatoes
- E. Ostap and Tree(树形dp)
- Ural 1195 Ouths and Crosses
- Mahmoud and a Dictionary CodeForces - 766D 种类并查集
- Ural2102:Michael and Cryptography(数论&素数)
- India and China Origins---hdu5652(二分 + bfs)或者(并查集)
- 【线性筛】【筛法求素数】【素数判定】URAL - 2102 - Michael and Cryptography
- [URAL 1553]Caves and tunnels(树链剖分)
- Codeforces 400 D.Dima and Bacteria(并查集+弗洛伊德)
- 世界杯Again!——并查集 and STL(其实完全可以不用并查集)
- HDU 1312 Red and Black(并查集或者BFS)
- Ural 2067 Friends and Berries 【思维】
- URAL 2001. Mathematicians and Berries
- URAL 1026. Questions and answers
- URAL 1960- Palindromes and Super Abilities (回文树)
- URAL 1960 Palindromes and Super Abilities (Palindromic Tree)