RQNOJ PID36 数石子

来源:互联网 发布:mac合盖播放 编辑:程序博客网 时间:2024/05/16 18:05

带权并查集

题目传送门

对于每个节点,记录一个dis,表示它到父亲节点的距离是多少。在找爸爸时更新即可。

注意这个网站不能加fread读优(血一般的教训)

代码:

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 5000using 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;}
原创粉丝点击