gym101964H Modern Djinn SEERC2018

博客作者分享了一道关于图论的问题,其中涉及到了概率计算和随机化策略。题目要求在给定的有向图中找到一种节点开心不开心的状态分配,使得至少有M/4+1条边满足特定条件。作者指出,通过随机为每个节点分配开心或不开心,满足条件的概率较大,并提供了相应的C++代码实现。
摘要由CSDN通过智能技术生成

https://codeforces.com/gym/101964/problem/H

这题没时间思考了。。。感觉是有可能想出来的。。。主要是前期G和I题做太久了,前期签到也是各种wa。。。

题面剧毒就不说了,1-M写成1-N,那么if and only if感觉出题人根本不懂什么叫充分必要,然后样例输入还是错的。。。

意思是对于每条边有向边如果x是开心,y是不开心,那么x->y这条wish就被满足了,题目给你M条边,让你找出某种情况下至少有M/4+1条边满足了,然后给出任意一种方案,只要给出哪些边被满足了

我们知道对于每一条边x->y,对于x,y随机开心不开心,那么x->y被满足的概率就是1/4了,那么这题随机一下每个点时开心还是不开心,有M/4+1条边被满足的概率是很大的,所以随机到满足就行了。。。有点像ccpc2017哈尔滨的那个几何题

#include<bits/stdc++.h>
using namespace std;

const int maxl=2e5+10;
mt19937 rnd(time(NULL));

int n,m,sum;
int a[maxl];
struct node
{
	int x,y;
}e[maxl];

inline void prework()
{
	scanf("%d%d",&n,&m);
	int u,v;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		e[i]=node{u,v};
	}
}

inline void mainwork()
{
	sum=0;int lim=m/4+1;
	while(sum<lim)
	{
		sum=0;
		for(int i=1;i<=n;i++)
			a[i]=rnd()%2;
		for(int i=1;i<=m;i++)
		if(a[e[i].x] && !a[e[i].y])
			++sum;
	}
}

inline void print()
{
	printf("%d\n",sum);
	for(int i=1;i<=m;i++)
	if(a[e[i].x] && !a[e[i].y])
		printf("%d ",i);
	puts("");
}

int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值