HDU 3038 How Many Answers Are Wrong

来源:互联网 发布:复杂网络 动态画图 编辑:程序博客网 时间:2024/04/28 04:39

题意:有n个点,m条信息。每条信息的内容是两个点之间的和的大小。求有多少条信息与上面的信息是矛盾的。

思路:a到b 的大小为s,可以理解为b -(a-1) 为s

#include<cstdio>#define MAX 200005int f[MAX];int v[MAX];//到根节点的距离int ans;int finds(int x){    if(f[x]==-1)return x;    int tmp=finds(f[x]);    v[x]+=v[f[x]];  //  这里更新该路径上的所有点到根节点的距离    return f[x]=tmp;  //压缩路径}void unite(int p1,int p2,int w){    int t1=finds(p1);    int t2=finds(p2);    if(t1!=t2)    {        f[t2]=t1;        v[t2]=v[p1]-v[p2]+w; //这里的意思是  两个根节点的距离+vp2=vp1+w  要注意方向       // printf("s%d\n",v[t2]);    }    else    {        if(v[p2]-v[p1]!=w)ans++;    }}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        ans=0;        for(int i=0;i<=n;i++)        {            f[i]=-1;            v[i]=0;        }        for(int i=0;i<m;i++)        {            int a,b,w;            scanf("%d%d%d",&a,&b,&w);            a--;            unite(a,b,w);        }        printf("%d\n",ans);    }}
0 0
原创粉丝点击