首页 > 其他分享 >UVA11294 Wedding 题解

UVA11294 Wedding 题解

时间:2024-10-26 10:47:32浏览次数:8  
标签:连边 同侧 int 题解 新娘 UVA11294 dfn low Wedding

洛谷题目传送门

前排提示:本题需要用到知识点 2-SAT 以及强联通分量,模板传送门 P4782 【模板】2-SAT

题目大意:

有至多 30 30 30 对夫妻将会参加一个婚宴。他们将会坐在一个长桌子的两边

新郎新娘坐在彼此相对的一端并且新娘带着一个头饰使得她看不到和她坐在同一边的人。夫妻坐在同一边是被视为“晦气”。并且这些人中还有人是通奸关系,并且新娘同时看到任何一对中的两个人也被视为“晦气”。你的工作是去安排人们坐在桌子两边从而避免任何“晦气”。

题目分析:

本题比较容易看出来是 2-SAT 的套路,考虑将 n n n 对夫妻拆成 2 n 2n 2n 点,第 i i i 对夫妻在代码中记作为 i i i 和 i + n i+n i+n, x x x 表示妻子与新郎同侧, ¬ x \lnot x ¬x 表示丈夫与新郎同侧。

对于一对关系 ( x , y ) (x,y) (x,y) 表示 x x x 和 y y y 不能坐在桌子的同一边,故 x x x 向 ¬ y \lnot y ¬y 连边, y y y 向 ¬ x \lnot x ¬x 连边。

最后考虑跑 Tarjan 染色,注意输出的时候需要将人物相反(即新郎同侧的是妻子,新娘同侧的是丈夫)。

注意事项:

  • 本题多测,记得清空数据
  • 编号从 0 0 0 开始,可以将所有编号 + 1 +1 +1,最后输出的时候记得 − 1 -1 −1,同理如果不改变编号用链式前向星存边的需要注意将 h e a d [ ] head[] head[] 数组初始化为 − 1 -1 −1;
  • 新娘和新郎别忘了也要连边,若将所有的编号 + 1 +1 +1,则别忘了对应的连边 add(1,1+n);

Code:

//i 表示第 i 对的丈夫和新娘坐 i+n 表示第 i 对的妻子和新娘坐
#include<bits/stdc++.h>
using namespace std;
const int N=65;
int n,m;
int dfn[N],low[N],bel[N],cnt,tc;
bool vis[N],flag;
vector<int> g[N];
stack <int> stk;
void init()//多测初始化清空
{
	cnt=tc=flag=0;
	for(int i=1;i<N;i++) g[i].clear();//别忘了边也要清空
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(bel,0,sizeof(bel));
}
void Tarjan(int u)//Tarjan 模板
{
	low[u]=dfn[u]=++tc;
	vis[u]=1;
	stk.push(u);
	for(auto v:g[u])
	{
		if(!dfn[v]) Tarjan(v),low[u]=min(low[u],low[v]);
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		++cnt;
		do
		{
			bel[u]=cnt;//染色,记录答案
			u=stk.top(),stk.pop();
			vis[u]=0;
		}while(low[u]^dfn[u]);
	}
}
int main()
{
	while(scanf("%d%d",&n,&m)&&(n+m))//多测注意结束条件为 n=0,m=0
	{
		init();//多测要清空
		g[1].push_back(1+n);//新娘向新郎连边
		while(m--)
		{
			int i,a,j,b;
			char x;
			scanf("%d%c",&i,&x),++i;//编号 +1
			a=(x=='w'?0:1);
			scanf("%d%c",&j,&x),++j;
			b=(x=='w'?0:1);
			g[i+n*(a&1)].push_back(j+n*(b^1));//省去了 if 判断过程
			g[j+n*(b&1)].push_back(i+n*(a^1));
		}
		for(int i=1;i<=n<<1;i++)
			if(!dfn[i]) Tarjan(i);
		for(int i=1;i<=n;i++)
			if(bel[i]==bel[i+n])
			{//若同时存在 x 与 ¬x 染上同样的颜色(处于同一环上),即坐在桌子的同一侧,那么输出 bad luck。
				flag=1;
				break;
			}
		if(flag)
		{
			puts("bad luck");//接上
			continue;
		}
		for(int i=2;i<=n;i++)
			printf("%d%c ",i-1,(bel[i]<bel[i+n]?'h':'w'));//注意输出
		puts(" ");
	}
	return 0;
}

标签:连边,同侧,int,题解,新娘,UVA11294,dfn,low,Wedding
From: https://blog.csdn.net/lunjiahao/article/details/143218915

相关文章

  • ctfshow web入门命令执行——web29-40题解
    web291.传入c参数来进行代码执行,payload: c=system("catfla*.php");  如图2.浏览器默认不显示php的标签所以需要右键查看源代码web30题目过滤了命令执行函数system,还可以用passthur(),过滤的字符可以用?代替单个字符。payload:?c=passthur("catfla?.p?p");查看源......
  • Anaconda + Vscode 和 Anaconda + Pycharm安装操作教程以及问题解决
    1.anaconda安装2.打不开AnacondaNavigation解决办法3.如何创建虚拟环境(2种方法)4.Anaconda+vscode5.Anaconda+pycharmAnaconda+Vscode和Anaconda+Pycharm安装操作教程以及问题解决1.anaconda安装Anaconda下载地址我选的是2020,11的一个版本。还没装之前电脑是有p......
  • Codeforces Round 981 (Div. 3)A-D题解
    CodeforcesRound981(Div.3)A.SakurakoandKosukeSakurakoandKosukedecidedtoplaysomegameswithadotonacoordinateline.Thedotiscurrentlylocatedinposition\(x=0\).Theywillbetakingturns,andSakurakowillbetheonetostart.Ont......
  • [Ynoi2015] 盼君勿忘 题解
    CSP前学习珂学,祝自己\(while(1)\rp++\)。考虑求解出每种数对答案的贡献。设\(t=r-l+1,k_x=\sum\limits_{i=l}^r[a_i=x]\),由容斥得贡献为\(x(2^t-2^{t-k_x})\)。求解\(k_x\),考虑莫队,时间复杂度为\(O(n\sqrtn)\),这也是本题的复杂度上限。由于\(p\)会变,所以不能用莫......
  • 题解:P11143 「SFMOI Round I」Strange Cake Game
    题目思路考虑贪心算法。根据题意,我们可以猜出结论,在最优状态下,小W将一直向下移动,小M一定向右移动。又因为小W是先手,所以当这块巧克力的横坐标小于等于纵坐标,即\(x\ley\)时,这块巧克力才可能归小W所有。另外,本题还有某些神秘做法可得\(20-25\)分。要特别注意的是......
  • 【题解】A. 错排问题
    递推T1题面(可从下方链接跳转看原题题面):求多少个n个数的排列,满足对于任意的i(1≤i≤n),有Ai≠i。题目传送门序言&结论:这是一道经典的题目,可以先记一下这个结论,设f[n]表示有n个数错排f[n]=(n-1)*(f[n-1]+f[n-2])推理过程:f[n]状态的设置是显然的(无需多言)边界......
  • 题解:Tokitsukaze, CSL and Stone Game
    ProblemLinkTokitsukaze,CSLandStoneGame题外话对于某些人说降绿甚至降黄,本人是很不同意的,毕竟多一道水蓝有什么不好题意翻译得很简洁,不再赘述。Solution不难发现有以下几种情况:只有两堆不等的,肯定选少的那堆,因为这样不易使得两堆相等。若两堆相等,一定破坏相等......
  • ZZJC新生训练赛第九场题解
    A题思路重点在于题目操作蕴含的奇偶数关系,一个偶数可以和一个奇数一起删除,两个奇数可以一起删除。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;cin>>n;vector<int>ar(......
  • 蓝桥首场算法团队战2024.10.24 题解(1~5)
    蓝桥首场算法团队战2024.10.24题解1:不同角度【算法赛】题意:给定自然数S,需要找出一个自然数T。使得数字T>数字S并且S和T转化为字符串后,满足S的字典序>T的字典序。T一定存在,找出符合条件且字典序最小的T。输入:第一行一个整数t,表示t组测试用例。\((......
  • AT_abc195_e 题解
    思路这道题需要倒序计算。定义$dp_{i,j}=f$表示第$i$轮结束后余数为$j$,$f=1$时,Takahashi必胜,否则Aoki必胜。动态转移方程式令:$x=dp_{i,(j\times10+a_i)\bmod7}$$y=dp_{i,j\times10\bmod7}$$dp_{i-1,j}=\begin{cases}x\\operatorname{or}\y&b_i=T\x\......