一笔画问题
一笔画
传统的一笔画是做完所有边,同时一条边不能重复走。现在增加一条规则最多只删除一条边能否一笔画
输入实例
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");
}