一笔画问题,属于图问题里面,我觉得主要用dfs算法。
一笔画问题,是欧拉做了一个定理,叫欧拉路/欧拉回路。怎么说呢,是要统计一个度。
给一张图——
image图——一笔画
这几个点的度,从上到下,从左到右,分别是:2、4、4、2、3、3、2。
这个时候,我们对这么几个度分分类,分为奇数,偶数,即点叫做奇点、偶点。
所以嘛,这两个度是3的点是奇点,一共有两个奇点。
欧拉路和欧拉回路是这么定义的:
当奇点个数为2个时,构成欧拉路;当奇点个数为0个时,构成欧拉回路;当奇点个数为4、6……时,不构成一笔画。(没有1个奇点)
这个时候呢,要看路线了。
当是欧拉路时,要从任意一个奇点开始,进行dfs;当是欧拉回路时,只随便找一个点,进行dfs,最终终点会是起点。
所以关键的代码是:
void dfs(int k)
{
for(int i=1; i<=n; i++)
{
if(b[i][k])
{
b[i][k]=false;
b[k][i]=false;
dfs(i);//尝试
}
}
go[++tot]=k;//记录
}
int main()
{
for(int i=1; i<=n; i++)
{
if(totn[i]%2)
{
sum++;
if(sum==1) start=i;
}//取起点
}
dfs(start);//dfs
return 0;
}