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