码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3038 How Many Answers Are Wrong 并查集

时间:2015-07-25 21:21:20      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

题目大致意思:第一行输入n,m,表示有共有n个数字,下面会有m行操作。每次输入ai,bi,si表示从ai到bi的和为si,最后输出有m次中有几次和上面的有冲突。

!!!!!!sum【x】表示从x的父节点到达x的值

#include <stdio.h>
#include <string.h>
using namespace std;
const int MAXN=200010;
int p[MAXN];//保存每个数字的父节点
int sum[MAXN];//保存每个数字的父节点与自己本身之间的和
int Find(int x)
{
    if(x!=p[x])
    {
        int tmp=Find(p[x]);//保存父节点
        sum[x]+=sum[p[x]];//更新本身到达父节点的值
        p[x]=tmp;
    }
    return p[x];
}
int main()
{
    int n,m;
    int u,v,w;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
        {
            p[i]=i;
        }
        memset(sum,0,sizeof(sum));
        int ans=0;
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            u=u-1;//让左端点-1可以更好的操作数组,比如u=5,v=8,w=4,那么w是前八个数的和减去前四个数的和 即从第五个数到第八个数的和
            int t1=Find(u);
            int t2=Find(v);//分别找到u,v的父节点。
            if(t1!=t2)//不相同表示不在一起
            {
                p[t2]=t1;//合并
                sum[t2]=sum[u]-sum[v]+w;//不理解可以画图表示一下
            }
            else
            {
                if(sum[v]-sum[u]!=w)//起点相同那么不满足sum[v]-sum[u]==w就是与之前的有冲突
                    ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

hdu 3038 How Many Answers Are Wrong 并查集

标签:

原文地址:http://www.cnblogs.com/mengzhong/p/4676462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!