首页 > 其他分享 >P1525 [NOIP2010 提高组] 关押罪犯

P1525 [NOIP2010 提高组] 关押罪犯

时间:2024-03-07 18:44:58浏览次数:17  
标签:P1525 关押 int NOIP2010 next fa 20005 edge now

原题链接

题解1:

按边权从大到小排序,如果这条边的两个点没确定关系,那么把他们设为敌人
这样,就成了一棵棵最大生成树(因为有的罪犯之间没有怨气)
由敌人的敌人是朋友可以得出,如果两个点在同一棵树,且距离为偶数,那么代表他们之间互为朋友

code1

#include<bits/stdc++.h>
using namespace std;
struct unit
{
    int x,y,v;
    bool operator<(const unit &b) const {return v>b.v;}
}edge[100005];
int fa[20005]={0};
int depth[20005]={0};
vector<int> G[20005];
int finds(int now){return fa[now]=(fa[now]==now?now:finds(fa[now]));}
void ss(int now,int f)
{
    for(auto next:G[now])
    if(next!=f)
    {
        depth[next]=depth[now]+1;
        ss(next,now);
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)  cin>>edge[i].x>>edge[i].y>>edge[i].v;
    for(int i=1;i<=n;i++) fa[i]=i;
    sort(edge+1,edge+1+m);
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        int x=edge[i].x,y=edge[i].y;
        if(finds(x)!=finds(y))//如果两者之间没有确定关系,确定为敌人关系
        {
            fa[finds(x)]=finds(y);
            G[x].push_back(y);
            G[y].push_back(x);
        }
    }
    for(int i=1;i<=n;i++)
    if(!depth[i])//并不是所有罪犯之间都有仇恨
    {
        depth[i]=1;
        ss(i,0);
    }
    for(int i=1;i<=m;i++)  if((depth[edge[i].x]^depth[edge[i].y])%2==0) ans=max(ans,edge[i].v);//如果是同号,即两者距离为偶数
    cout<<ans;
    return 0;
}

标签:P1525,关押,int,NOIP2010,next,fa,20005,edge,now
From: https://www.cnblogs.com/pure4knowledge/p/18059532

相关文章

  • P1541 [NOIP2010 提高组] 乌龟棋题解
    有两种方法,代码注释都很详细了直接上代码一:记忆化搜索#include<bits/stdc++.h>usingnamespacestd;intt[15];intn,m;inta[400];intmp[45][45][45][45];//mp[i][j][k][l]表示1号用i张,2号用j张,3号用k张,4号用l张的情况下,最多能拿多少分intdfs(intstep,intw)//step......
  • [NOIP2010 提高组] 关押罪犯 - 洛谷
    P1525[NOIP2010提高组]关押罪犯-洛谷|计算机科学教育新生态(luogu.com.cn)种类并查集#include<bits/stdc++.h>#definedebug(a)cout<<#a<<"="<<a<<'\n';usingnamespacestd;usingi64=longlong;typedefpair<i64,i64>......
  • P1525 [NOIP2010 提高组] 关押罪犯
    P1525[NOIP2010提高组]关押罪犯法一:二分图把犯人分配到两个监狱,使得监狱内的怒气值最大最小分配到两个集合中,考虑二分染色分析因为答案具有单调性所以可以二分:判断x是否符合,只需要重建大于x的边,如果不能把它们分到两个集合中(二分染色失败),就往上调(考虑无限大,那么就不矛盾)......
  • [NOIP2010 提高组] 乌龟棋
    题目背景小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。题目描述乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数)。棋盘第11格是唯一的起点,第NN格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中MM张爬行卡片,分成44种不同的类型(MM张......
  • P1540 [NOIP2010 提高组] 机器翻译
    传送门题目背景小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。题目描述这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;......
  • P1514 [NOIP2010 提高组] 引水入城
    link搜索。首先先用\(dfs\)判断一下对于每一个点来说对应的可以覆盖的\(L,R\).假设题目一定存在一个解,所以一定会有该点覆盖的区间连续。设该区间为\(L,R\),若不是每一个点均会被覆盖,那么题目不会存在任何一个解。判断是否有解:跑一遍\(dfs\),记录每一个点被\(dfs......
  • 「NOIP2010」机器翻译 题解
    前言附加任务这道题也是一个简单模拟题。传送门解析这道题就是一个简单的模拟题,简单来说就是如果内存里面没有这个单词(其实是一个数)的话就从外存入队,如果内存容量不够,出队即可。对了,每次查询时还要计数噢!代码话不多说上代码#include<bits/stdc++.h>usingnamespacestd......
  • [NOIP2010 提高组] 乌龟棋
    题目大意有四种卡片,它们分别可以让你前进1格,2格,3格和4格.在前进的道路上到达每个格子都会得到对应的积分.现在分别给出四种卡片的数量,求用完所有卡片能获得的最大积分和思路由于卡片只有4种,且每种的数量不超过20张,所以想到开四维dp,用dp[i][j][k][z]来表示用掉i张卡片4,j......
  • 算法学习记录:[NOIP2010]机器翻译
    题目链接https://ac.nowcoder.com/acm/contest/20960/1003记录:这道题我真的吃......
  • 23.4.15 NOIP2010提高游记
    第一次做提高,之前做的都是普及,还是感觉挺难的,心态有点裂开。1.机器翻译这题首先一看就是一道模拟题目,要注意的是字典的内存问题,在超内存以后要减1,直接上代码:-),时间复杂度O(n)1#include<bits/stdc++.h>2#pragmaGCCopzimize(3)3usingnamespacestd;4inlinelon......