hdu 3038 How Many Answers Are Wrong (种类并查集)

来源:互联网 发布:wamp配置域名 编辑:程序博客网 时间:2024/06/08 01:36

解题思路:这是并查集里面很特殊的一类题目,不仅仅需要考虑点与点之间的集合关系,点与点之间还有一定的关系,姑且把他称之为边权,解决这个问题就是要用到这种思想,针对每一条线段,我们把两个端点提取出来,把他们的和作为边权,然后建立并查集,如果一个线段的两个端点已经在同一个根节点下,那么根据定义是可以得到这条线段的值的,如果不在一个根节点,可以将两个集合合并,然后维护两个根节点形成的新的线段。

AC代码:

/*    @Author: wchhlbt    @Date:   2017/4/28*/#include <bits/stdc++.h>#define Fori(x) for(int i=0;i<x;i++)#define Forj(x) for(int j=0;j<x;j++)#define maxn 200007#define inf 0x3f3f3f3f#define ONES(x) __builtin_popcount(x)using namespace std;typedef long long ll ;const double eps =1e-8;const int mod = 1000000007;typedef pair<int, int> P;const double PI = acos(-1.0);int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};int n,m;int ans;int f[maxn];//保存每个线段的起点int sum[maxn];//保存当前节点到根节点的路径长度,每条线段的和存放在子节点上void init()//初始化{    for(int i = 0; i<maxn-2; i++)        f[i] = i , sum[i] = 0;}int find(int u)//更新父节点{    if(u!=f[u]){        int t = f[u];        f[u] = find(f[u]);        sum[u] += sum[t];//同时维护子节点到根节点的路径长度(从根节点到它的线段和)    }    return f[u];}void connect(int l, int r, int s){    int x = find(l);    int y = find(r);    if(x!=y){        f[x] = y;        sum[x] = sum[r] - sum[l] - s;//确定新建立联系的两个节点的路径长度    }    else{        if(sum[r]-sum[l]!=s)//确定冲突条件            ans++;    }}int main(){    //freopen("test.txt","r",stdin);    while(~scanf("%d%d",&n,&m))    {        ans = 0;        init();        int l,r,s;        for(int i = 0; i<m; i++){            scanf("%d%d%d",&l,&r,&s);            l--;//将闭区间转化为左开右闭,保证区间有交集            connect(l,r,s);        }        printf("%d\n",ans);    }    return 0;}/*unsigned   int   0~4294967295int   2147483648~2147483647unsigned long 0~4294967295long   2147483648~2147483647long long的最大值:9223372036854775807long long的最小值:-9223372036854775808unsigned long long的最大值:18446744073709551615__int64的最大值:9223372036854775807__int64的最小值:-9223372036854775808unsigned __int64的最大值:18446744073709551615*/

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 门的锁坏了怎么办 汽车门把锁坏了怎么办 厨柜门上的板板掉了怎么办 衣柜门滑轮坏了怎么办 厨房推拉门推动时有声音是怎么办? 塑料推拉门声音大怎么办不好推 推拉门锁扣坏了怎么办 衣柜移门拉不动怎么办?如何保养 擦黑色桌面有层白灰怎么办 宝宝睡觉不盖被子怎么办 孩子盖被子就哭怎么办 一盖被子就发烧怎么办 两岁宝宝认被子盖怎么办 小孩吃多了发烧怎么办 两岁宝宝拉蛔虫怎么办 吃了长蛆的东西怎么办 被蜱虫咬了又找不到虫子怎么办 木家具生黑虫子怎么办 吃了发霉的面包怎么办 种的韭菜有蛆怎么办 活狗身上长蛆虫怎么办 狗身上会有蛆虫怎么办 狗身上长满了蛆怎么办 房间墙上有很多小虫子怎么办 床上有许多小虫子怎么办? 店里有许多小虫子怎么办 房间潮湿有很多小虫子怎么办 家里潮湿墙上发霉长小虫怎么办? 房间有小飞虫子怎么办 狗被灭虫剂喷了怎么办 吃鸡玩久了手机屏幕很涩怎么办 超东卧室太阳晒怎么办 床头上的布破了怎么办 老年机全静音了怎么办 老年机手机不亮怎么办 70岁老人耳朵聋怎么办 血压太低了头晕怎么办 血压高忽然变低怎么办 血压高眼睛红了怎么办 高血压200降不下去.怎么办 高血压吃药降不下来怎么办