洛谷P1525关押罪犯——并查集

题目:https://www.luogu.org/problemnew/show/P1525

并查集+贪心,从大到小排序,将二人分在不同房间,找到第一个不满足的即为答案。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,fa[20005],ans,ct,d[20005];
struct N{
	int hd,to,w;
}edge[100005];
bool cmp(N x,N y)
{
	return x.w>y.w;
}
int find(int x)
{
	if(fa[x]==x)return x;
	else
	{
		int root=find(fa[x]);
		d[x]+=d[fa[x]];
		fa[x]=root;
	}
	return fa[x];
}
int main()
{
	scanf("%d%d",&n,&m);
	int a,b,c;
	for(int i=1;i<=m;i++)
	{
		ct++;
		scanf("%d%d%d",&edge[ct].hd,&edge[ct].to,&edge[ct].w);
	}
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		int u=find(edge[i].hd);
		int v=find(edge[i].to);
		if(u==v&&(d[edge[i].to]-d[edge[i].hd])%2==0)//在同间
		{
			ans=edge[i].w;
			break;
		}
		if(u!=v)
		{
			fa[u]=v;
			d[u]=d[edge[i].to]-d[edge[i].hd]+1;//dhd+du=dto+1;
		}
	}
	printf("%d",ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Zinn/p/8439980.html

时间: 2024-10-10 08:01:33

洛谷P1525关押罪犯——并查集的相关文章

洛谷P1525 关押罪犯 并查集

无冲突 输出 0 洛谷P1525 关押罪犯 并查集 用拆点法 将一个点拆成两份 一个点和 x 的朋友相连 一个点和 x的敌人相连 若 x 与 y 是敌人 因为只有两个阵营 所以满足敌人的敌人就是朋友 然后 x 连向 y 的敌人 y 连向 x 的敌人 因为这是双向边 所以 y的朋友就是x的敌人就不用连了 如果某一时刻 getfather(e[ i ].from)==getfather(e[ i ].to) 这说明两个点已经是敌人关系的两个人 通过朋友关系连上了 那就结束了 1 #include <

洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误,错误编号-… 点2是何方神圣? 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.

洛谷——P1525 关押罪犯

https://www.luogu.org/problem/show?pid=1525 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中的所有冲突事件按

NOIP2010 提高组 洛谷P1525 关押罪犯

刚才做并查集想到了这道以前做的题,干脆一并放上来 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到

洛谷 P1525 关押罪犯 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1525 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,

P1525 关押罪犯 并查集

题目链接:https://www.luogu.org/problemnew/show/P1525 一道很难想到思路的题,还可以用二分图染色法,但我们只考虑并查集 要使得冲突最小,首先我们应该让冲突大的尽可能的不在同一个监狱 如果两个相互冲突的人都与第三个人冲突,那么应优先让冲突大的在不同的监狱 那么冲突小的冲突就是不可避免地冲突 如果整个过程都按照冲突的大小从大到小进行的话第一个不可避免的冲突就是将会发生的冲突中最大的一个 用并查集来实现的话,就是将敌人的敌人与自己放在同一个集合中,在同一个集合

洛谷P1525关押罪犯——二分做法

题目:https://www.luogu.org/problemnew/show/P1525 二分答案,二分图染色判断是否可行. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,ct,head[20005],ans,mx,mid; bool col[20005],vis[20005]; struct N{ int to,next,w; }ed

NOIP2010关押罪犯[并查集|二分答案+二分图]

题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里.公务繁忙的Z 市长只会去看列表

[noip2010]关押罪犯 并查集

第一次看的时候想到了并查集,但是不知道怎么实现: 标解,f[i]表示i所属的集合,用f[i+n]表示i所属集合的补集,实现的很巧妙,可以当成一个使用并查集的范例: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<map> 6 #include<ctime> 7 #include<vector>