洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯

#题目描述

#一看很明显是贪心算法 加排序 因为 这个中间最大值的那一对肯定是不会在一起的 从大到小来看 所有点对都尽量不要在一个监狱
#带权并查集 这个想不出来 只想到了并查集 来判段是不是在一个监狱 想不出怎么合并 (⊙ˍ⊙)

#知识点
并查集 贪心 排序 二分图(不了解)

#代码
第一次
10分 我想的是两个都不确定的情况就两种情况都试试 再来找小的那个值

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stdio.h>
using namespace std;
int relat[20010];
int root[20010];
int sum[3];
int n,m,a,b,c,ans;
struct node
{int x;int y;int z;
} Data[100020];
bool cmp(node a,node b)
{return a.z < b.z;
}
void init()
{for(int i=1; i<=n; i++){root[i] = 0;}int i = m;root[Data[i].x] = 1;root[Data[i].y] = 2;//cout << Data[i].x <<" "<< 1 <<"   " <<Data[i].y  <<"   " << 2 <<endl;for(int i=0; i<3; i++){sum[i] = 0;}
}
void dfs(int step)
{if(step == 0){ans = min(sum[1],sum[2]);
//        cout << "有值了 " <<"ans = "<< ans <<endl;return ;}int a = Data[step].x;int b = Data[step].y;
//    cout << a <<" 和 "<< b <<"有矛盾   值为 " <<Data[step].z <<endl;
//    cout << root[a] << "  " <<root[b] <<endl;if(root[a] == root[b])//在同一个监狱  会有问题{if(root[a] == 0)//没出现过{//先将a放到 1 b放到2 再倒过来试试root[a] = 1;root[b] = 2;dfs(step-1);root[a] = 2;root[b] = 1;dfs(step-1);}else{sum[root[a]] = max(sum[root[a]],Data[step].z);dfs(step-1);}}else if(root[a] == 1) //在一号监狱{if(root[b] == 0){root[b] = 2;}dfs(step-1);}else if(root[a] == 2) //在2号监狱{if(root[b] == 0){root[b] = 1;}dfs(step-1);}else if(root[a] == 0) //没出现过{if(root[b] == 1){root[a] = 2;}else if(root[b] == 2){root[a] = 1;}dfs(step-1);}}
int main()
{cin >> n >> m;for(int i =1; i<= m ; i++){cin >> a >> b >> c;Data[i].x = a;Data[i].y = b;Data[i].z = c;}sort(Data+1,Data+1+m,cmp);init();
//    for(int i=1; i<=n; i++)
//    {//        cout << i << "  " <<root[i] <<endl;
//    }ans = 0x3f3f3f3f;dfs(m-1);cout << ans <<endl;return 0;
}

第二次
后来改用了遍历 这个监狱 发现比第一种 递归还差 因为放在那个监狱当前不知道不代表之后不知道 有很大的局限性 后来看来看大佬的想法 (敌人的敌人对我不会是最差的那个) 这样的想法来合并 秒啊!!! (≧0≦)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stdio.h>
using namespace std;
int relat[20010];
int root[20010];
int n,m,a,b,c,ans;
struct node
{int x;int y;int z;
} Data[100020];
bool cmp(node a,node b)
{return a.z > b.z;
}
void init()
{for(int i=1; i<=n; i++){root[i] = i;}memset(relat,0,sizeof(relat));
}
int Find(int a)
{if(a == root[a])return a;else{root[a] = Find(root[a]);return root[a];}
}
int main()
{cin >> n >> m;for(int i=1;i<=m;i++){cin >> Data[i].x >> Data[i].y >> Data[i].z ;}sort(Data+1,Data+1+m,cmp);init();
//    for(int i=1;i<=m;i++)
//    {//        cout << Data[i].x <<"-" <<root[Data[i].x] <<" "<<Data[i].y <<"-" <<root[Data[i].y] <<endl;
//    }for(int i=1;i<=m+1;i++)//m+1时  有相同的根  所以会输出 0 妙啊!!{int a = Data[i].x;int b = Data[i].y;int ra = Find(a);int rb = Find(b);if(ra == rb){cout << Data[i].z <<endl;//因为是降序排序  后面的不可能有这个大  这就是最大的了break;}else // 关系不好 是互相的  这个关系在没有解决  (这个合并的关系 敌人的敌人和我的关系没有对敌人那么不好 可以这么试着理解){if(relat[a] == 0)//a 没有关系不好的{relat[a] = b;//当前这个就是同a关系不好的}else//a 有关系不好的{c = relat[a];//b 和这个c 在一个监狱 c是a的敌人int rc = Find(c);if(rc != rb){root[rc] = rb;}}if(relat[b] == 0)//b 没有关系不好的{relat[b] = a;//当前这个就是同b关系不好的}else//b 有关系不好的{c = relat[b];//a 和这个c 在一个监狱 c是b的敌人int rc = Find(c);if(rc != ra){root[rc] = ra;}}}}return 0;
}

#总结
这个想法要多思考多理解 这是没错的 常话还是有道理的 ^ _ ^

#洛谷oj:P1525 [NOIP2010 提高组] 关押罪犯相关推荐

  1. [NOIP2010提高组]关押罪犯

    题目:洛谷P1525.Vijos P1776.codevs1069. 题目大意:有一些罪犯,两个罪犯之间可能会发生冲突,冲突有个影响力,而如果两个罪犯在不同监狱里,就可以避免冲突.现在有两个监狱,要你 ...

  2. NOIP2010提高组 关押罪犯

    题目链接 题意就是,把罪犯放到两个不同的监狱中,每个犯人之间可能会有冲突值,如果两个犯人分在同一个监狱内他们的冲突值就会被激活,产生影响力为冲突值的冲突,监狱内的冲突值为所有人之间冲突的最大值,求分配 ...

  3. 【洛谷】P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布(详细代码)

    [洛谷]石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏. 1.[题目描述] 2 ...

  4. c/c++ 洛谷 P1003 【NOIP2011 提高组】 铺地毯

    题目链接 洛谷 P1003 [NOIP2011 提高组] 铺地毯 不想戳的看下图: 样例及解释 数据范围 解题思路: 从后往前找地毯,找到了我就输出并返回. 代码如下: #include <io ...

  5. 洛谷:P1033 [NOIP2002 提高组] 自由落体 C++详解

    题目描述 在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,⋯,n−1.在地面上有一个小车(长为 L,高为 K,距原点距离为 S1​).已知小球下落距离计算公式为 d=0.5×g ...

  6. 洛谷P1017题解 [NOIP2000 提高组] 进制转换

    原文地址:https://luvletter.blog.luogu.org/p1017-ti-jie P1017 [NOIP2000 提高组] 进制转换 题目描述 我们可以用这样的方式来表示一个十进制 ...

  7. 【洛谷 P1970】 [NOIP2013 提高组] 花匠

    解题思路 70分: 很明显的一个线性DP #include<bits/stdc++.h> using namespace std;int n,a[100010],f[100010][3], ...

  8. NOIP2010提高组题解

    [NOIP2010 提高组] 机器翻译 题目:[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单 ...

  9. 凡人升天传7——NOIP2010 提高组复赛题解

    本蒟蒻在考试时最后一道直接报零*__*,悲痛欲绝,因此在这里著下本题解. 可恶的西西弗 虽然题目做的很垃圾,但在写题解中途不得不感叹除了最后一道,其他真是好水题呀!!! --------------- ...

最新文章

  1. 牛客网-斐波那契数列
  2. 命令行参数的模式匹配
  3. 注解方式使用 Redis 缓存
  4. maven安装与项目创建
  5. 踩内存是什么意思啊_网络资讯:0x0000008e蓝屏代码是什么
  6. Unreal、CryEngine、Gamebryo引擎介绍
  7. python---保留两位小数
  8. 记一次route配置不起作用的问题解决过程
  9. Android组件化项目详细实施方案
  10. tbb::parallel_for 实例
  11. 【新手上路常见问答】关于物联网设计
  12. 推荐一个项目管理工具:TAPD
  13. 速成应用免费教你如何制作开发预约类型的美容美发行业微信小程序「教程」
  14. Java如何提高poi的user模式解析excel大小上限
  15. smp irq affinity介绍
  16. 微信小程序 图片懒加载
  17. “Spark三剑客”之SparkCore和SparkSql学习笔记(零基础入门)(一)
  18. Vitalik Buterin:我的 40 升背包旅行指南
  19. storyboard(故事版)新手教程 图文详解 3.在故事版上使用scrollview
  20. 1、VS2019配置glfw和glad

热门文章

  1. 关于代码家(干货集中营)共享知识点汇总系列——App
  2. whatsapp协议接口 云控成品
  3. 【Python ----代码规范 】
  4. mysql省市区邮政编码和区号级联sql文件
  5. 微信公众号开发 (3) 菜单处理
  6. Spring cloud多模块开发下openFeign的使用,自动注入出现bean找不到问题解决
  7. python每个if条件后面都要使用冒号_每个if条件后面都要使用冒号。( )_学小易找答案...
  8. 操作系统银行家算法python简单模拟
  9. 分支函数c语言,C语言练习题2(分支结构 循环结构 数组 函数2009-2012二级真题 ).doc...
  10. 【单片机】STM32 最小板 学习笔记