hdu 1181 变形课

11 篇文章 0 订阅
8 篇文章 0 订阅

hdu  1181  变形课                      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1181

最小生成树? 并查集? DFS? BFS?Dijkstra? floyd?回溯递归?

题目分析:用图来做的思想大概是这个样子,用邻接矩阵记下最初可匹配状态,然后一遍一遍刷,增加匹配关系,最多25遍就可把全图刷完。

code:

#include<cstdio>
#include<cstring>
bool m[26][26],set[26];
int main()
{
	int i,j,k;
	char c[1001];
	while(scanf("%s",c)!=EOF)
	{//头上的控制值得一学 
		if(c[0]=='0')
		{
			printf("No.\n");
			continue;
		}//一开始居然把初始化放在输入后了TAT 
		memset(m,false,sizeof(m));
		memset(set,false,sizeof(set));
		m[c[0]-'a'][c[strlen(c)-1]-'a']=true;
		while(scanf("%s",c)!=EOF&&c[0]!='0')
		{
			m[c[0]-'a'][c[strlen(c)-1]-'a']=true;
		}
		set[1]=true;
		for(i=1;i<26;i++)
		{//由于不用匹自己,所以最多跑25遍也就够了 
			for(j=0;j<26;j++)
			{
				if(!set[j]&&m[1][j])
				{//B都能匹到哪些,刷一遍 
					set[j]=true;
					break;
				}
			}//如果B能把26个都匹到,那就没必要再往下走了,必有M结尾的 
			if(j==26||m[1][12])break;
			for(k=0;k<26;k++)
			{//把B伸两次胳膊能够到的也记下来 
				if(!set[k]&&m[j][k])m[1][k]=true;
			}
		}
		printf("%s\n",m[1][12]?"Yes.":"No.");
	}
	return 0;
}

PS:DFS也行,上面这种做法看起来很像这几天正在学的二分匹配,有空把DFS法水出来。

……神题,这么多种做法,可以通过这个题熟悉一下算法了

感谢大神silence,http://blog.sina.com.cn/s/blog_64107d290100h59k.html






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值