How Many Answers Are Wrong Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
Sample Output
#include<iostream> #include<cstdio> using namespace std; #define N 200005 int f[N], r[N]; // f数组存储下标根节点,r存储下标到根节点(把一棵树上最左边数置为根节点方便判断,的sum int found(int x) { int k = f[x]; if(f[x] != x) { f[x] = found(f[x]); r[x] = r[x]+r[k]; // 根节点在变,r肯定随之改变,就是之前根节点sum,加上根节点到r【f【x】】; } return f[x]; } int main() { int n, m, a, b, s; while(cin >> n >> m) { int cou = 0; for(int i = 1; i <= n; i++) f[i] = i, r[i] = 0; // 初始化,最开始f是自身,r是0; for(int i = 0; i < m; i++) { cin >> a >> b >> s; a--; // 为什么减一,首先你要读懂题意,当要判断3和5之间sum时,你就要用5到相同根节点的sum-2到同根sum(因为爱情=.=|| int na = found(a), nb = found(b); if(na == nb && (r[a] + s) != r[b]) // 相同根节点时,eg:3,5。就要用2到相同根节点的sum+s(3~5sum,是否等于5~相同根节点sum cou++; else if(na > nb) { f[na] = nb; r[na] = r[b]-r[a]-s; // if不在一棵树上(之前没联系,画个三角形箭头指向左边(较小的数,就知道该减还是加了 } else if(na < nb) { f[nb] = na; r[nb] = r[a] - r[b] + s; // 箭头指向较小的数即根节点。 } } cout << cou << endl; } return 0; }
原文:http://www.cnblogs.com/Tinamei/p/4676597.html