一笔画问题
一笔画
传统的一笔画是做完所有边,同时一条边不能重复走。现在增加一条规则最多只删除一条边能否一笔画
输入实例
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");
}
本文作者:有间猫
本文链接:https://www.cnblogs.com/itcod/p/15901127.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步