题目一:How Many Answers Are Wrong
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200005;
int p[N],d[N]; //p为集合,d为边权值
int m,n; //m个数字,n次操作
int find(int x)
{
if(x!=p[x])
{
int u = find(p[x]);
d[x] += d[p[x]];
p[x] = u;
}
return p[x];
}
int main()
{
cin >> m >> n;
for(int i = 1 ;i<=m ;i++)
p[i] = i;
int ans = 0;
while (n -- )
{
int l , r , val;
cin >> l >> r >> val;
l--;
int pl = find(l);
int pr = find(r);
if(pl == pr)
{
if(d[l] - d[r] != val)
ans++;
}
else
{
p[pl] = pr;
d[pl] = -d[l] + d[r] + val;
}
}
cout << ans;
return 0;
}
题目二:分数查询
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int p[N],d[N];
int m,n,q;
int find(int x) // 并查集
{
if (p[x] != x)
{
int u = find(p[x]);
d[x] += d[p[x]];
p[x] = u;
}
return p[x];
}
int main()
{
cin >> n >> m >> q; //n个同学,m条消息,q个询问
for(int i = 1 ; i <= n; i++)
p[i] = i;
while (m -- )
{
int a,b,s;
cin >> a >> b >>s;
int pa = find(a);
int pb = find(b);
if(pa!=pb)
{
p[pa] = pb;
d[pa] = -d[a] + d[b] + s;
}
}
while(q--)
{
int a,b;
cin >> a >> b ;
int pa = find(a);
int pb = find(b);
if(pa!=pb)
cout << "-1" <<endl;
else
cout << d[a] - d[b] << endl;
}
return 0;
}