带权并查集
对于每个节点,记录一个dis,表示它到父亲节点的距离是多少。在找爸爸时更新即可。
注意这个网站不能加fread读优(血一般的教训)
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 5000
using namespace std;
int n,m,k;
int fa[MAXN+5],dis[MAXN+5];
int findfather(int x){
if (fa[x]==x) return x;
int fx=findfather(fa[x]);
dis[x]+=dis[fa[x]];
return fa[x]=fx;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=n;i++)
fa[i]=i;
memset(dis,0,sizeof(dis));
while (m--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
x--;
int fx=findfather(x),fy=findfather(y);
if (fx!=fy){
fa[fy]=fx;
dis[fy]=z-dis[y]+dis[x];
}
}
while (k--){
int x,y;
scanf("%d%d",&x,&y);
x--;
int fx=findfather(x),fy=findfather(y);
if (fx!=fy) printf("UNKNOWN\n");
else printf("%d\n",dis[y]-dis[x]);
}
return 0;
}