一笔画问题

一笔画

传统的一笔画是做完所有边,同时一条边不能重复走。现在增加一条规则最多只删除一条边能否一笔画
image

输入实例

4
0111
1011
1101
1110

输出实例

True

题解

可以作为一个的欧拉路径,欧拉路径的回路为奇点为0或者2个,首先可以判断节点个数,如果不满足则通过dfs遍历图,获取某一次遍历剩余为遍历边的最小值。如果最小值不大于1,则删除一条边后图够成欧拉回路

点击查看代码
#include <iostream>
#include <string.h>
using namespace std;

void finddel(int **map, const int &n, int start, int bn, int& seq)
{
	for(int j = 0; j < n; ++j)
	{
		if(map[start][j] == 1)
		{
			map[start][j] = map[j][start] = 2;
			finddel(map, n, j, bn - 1, seq);
			map[start][j] = map[j][start] = 1;
		}
	}
	if(bn < seq)
		seq = bn;
}

int main()
{
	int n;
	cin >> n;
	getchar();
	int **map=new int*[n];
	for(int i = 0; i < n; ++i)
		map[i] = new int[n];
		
	int *pcn = new int[n];
	memset(pcn, 0, n * sizeof(int));
	const char *ans = "True";
	
	int bn;
	for(int i = 0; i < n; ++i)
	{
		bool noc = false;
		for(int j = 0; j < n; ++j)
		{
			//cin >> map[i][j];
			char in;
			scanf("%c", &in);
			map[i][j] = in - '0';
			if(in == '1')
			{
				noc = true;
				++pcn[i];
				++bn;
			}
		}
		if(!noc)
			ans = "False";
		getchar();
	}
	bn = bn / 2;
	int start = 0, sg = 0;
	for(int i = 0; i < n; ++i)
	{
		if(pcn[i] % 2)
		{
			start = i;
			sg++;
		}
	}
	
	if(sg != 0 && sg != 2)
	{
		int pairbn = bn * bn;
		finddel(map, n, start, bn, pairbn);
		ans = (pairbn <= 1 ? "True" : "False");
	}
	cout << ans << endl;
	system("pause");
} 
posted @ 2022-02-16 16:07  有间猫  阅读(87)  评论(0编辑  收藏  举报