原来我就像印度电工,哪用到就在那声明,特别乱而且容易出戳,现在我变成德国电工了哈哈哈哈~
#include<iostream>
#include<vector>
using namespace std;
vector<int>nume[509];//记录度数出边数
int visit[509]={0},cnt=0;//记录是否访问过q
//判断是否连通,看看顶点数是多少,自然不能有重复访问顶点的情况
//cnt 1
// cnt 不能固定在参数列表考虑到递归对return 的影响还是写无返回值函数(注意)
void dfs(int index)
{//End
cnt++;
visit[index]=1;
for(int i=0;i<nume[index].size();i++)
if(visit[nume[index][i] ]==0)
dfs(nume[index][i]);
}
int main()
{ int n,m,_1,_2,even=0,t=1;
cin>>n>>m;
for(int i=0;i<m;i++)
{ cin>>_1>>_2;
nume[_1].push_back(_2);
nume[_2].push_back(_1);
}
for(int i=1;i<=n;i++)
{
if(i!=1) printf(" ");
printf("%d",nume[i].size());
if(nume[i].size()%2==0) even++;
}
printf("\n");
dfs(1) ;
if(cnt!=n) printf("Non-Eulerian\n");
else if(even==n) printf("Eulerian\n");
else if(even==n-2) printf("Semi-Eulerian\n");
else printf("Non-Eulerian\n");
return 0;
}
总结
1.dfs尽量不要有返回值,因为递归过程会对他产生影响对return
2.注意直接将节点个数信息复制下来防止弄错
3.判断连不连通这里是一个好例子
英语
总结DFS 上次树的打印路径问题 popback尚未解决
与上次路径问题的区别是 上次是存入路径 中的设置标记 这次是只要访问过就要设标记而且不能再删除