小Hi的学校总共有N名学生,编号1-N。学校刚刚进行了一场全校的古诗文水平测验。
学校没有公布测验的成绩,所以小Hi只能得到一些小道消息,例如X号同学的分数比Y号同学的分数高S分。
小Hi想知道利用这些消息,能不能判断出某两位同学之间的分数高低
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 100100; int f[N]; int dist[N]; int find(int a){ int fa = f[a]; if(fa!=a) { f[a] = find(fa); dist[a] += dist[fa]; return f[a]; } else return fa; } int n,m,q; int main(){ int a,b,s; scanf("%d%d%d",&n,&m,&q); memset(dist,0,sizeof(dist)); for(int i=1;i<=n;i++) f[i] = i; for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&s); int fa = find(a); int fb = find(b); if(fa==fb) continue; f[fb] = fa; dist[fb] = dist[a]+s-dist[b]; } for(int i=0;i<q;i++){ scanf("%d%d",&a,&b); int fa = find(a); int fb = find(b); if(fa!=fb) printf("-1 "); else printf("%d ",dist[b]-dist[a]); } return 0; }