描述 | |
---|---|
知识点 | 链表,队列,栈,树,图,数组 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 |
1、输入点的个数
2、输入点的坐标 |
输出 |
如果可以一笔画这输出 画线顺序
|
样例输入 | 3 1 2 1 3 2 3 |
样例输出 | true |
欧拉定理 如果一个网络是连通的并且奇顶点的个数等于0或2,那么它可以一笔画出;否则它不可以一笔画出。
判断一笔画的方法:
①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。
②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。
#include<iostream>
#include<string>
using namespace std;
bool **p;
bool *con;
int *cnt;
void DFS(int cur,int n)
{
con[cur]=true;
for(int i=1;i<=n;i++)
if(p[cur][i])
{
cnt[cur]++;
if(!con[i])
DFS(i,n);
}
}
bool connect(int n)
{
for(int i=1;i<=n;i++)
if(!con[i])
return false;
return true;
}
int main()
{
int n,m;
cin>>n;
m=n+1;
p=new bool*[m];
for(int i=0;i<=n;i++)
{
p[i]=new bool[m];
memset(p[i],false,m*sizeof(bool));
}
con=new bool[m];
cnt=new int[m];
memset(con,false,m*sizeof(bool));
memset(cnt,0,m*sizeof(int));
int a,b;
for(int i=0;i<n;i++)
{
cin>>a>>b;
p[b][a]=p[a][b]=true;
}
DFS(1,n);
bool flag=connect(n);
int oddnum=0;
if(!flag)
cout<<"false"<<endl;
else
{
for(int j=1;j<=n;j++)
if(cnt[j]%2)
oddnum++;
if(oddnum==0||oddnum==2)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}
for(int i=0;i<m;i++)
delete [] p[i];
delete [] p;
delete [] con;
delete [] cnt;
//system("pause");
return 0;
}