一笔画问题

来源:互联网 发布:东北财经大学网络信息 编辑:程序博客网 时间:2024/04/30 00:34

这道题就是判断是否有欧拉路,解题的思路是先判断是否是通路,也就是dfs 深搜找到是否有路,然后再判断有奇数个结点的个数,如果奇数的结点的个数有0个或者2个就是欧拉路,否则就不是欧拉路。。。其他的就是细节的处理了,由于刚开始没有对每次全局变量初始化所以一直WA,这也说明了全局变量不是都很好用的,切记每次初始化。。。

点击打开链接

#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<cstring>using namespace std;int node[1005];bool map[1005][1005];bool flag,vis[1005];void dfs(int v,int n){    vis[v] = true;    for(int i=1; i<=n; i++)    if(!vis[i]&&map[i][v])    dfs(i,n);}void camp(int n, int e){    int v, u;    flag = true;    memset(map,false, sizeof(map));    memset(vis,false,sizeof(vis));   //记得每次初始化   for(int i=0; i<e; i++)   {   scanf("%d %d",&v,&u);   map[v][u] =map[u][v] = true;   }   dfs(1,n);   for(int i=1; i<=n; i++)   if(!vis[i])   {      flag = false;      printf("No\n");     return;   }   int cout,num=0;   for(int i=1; i<=n; i++)   {     cout =0;   for(int j=1; j<=n; j++)   {     if(map[i][j]==true)     cout++;   }   if(cout%2==1)   num++;   }   if(num==0||num==2)   {     flag = true;   }   else    {        flag = false;   }   if(flag) printf("Yes\n");   else printf("No\n");   return;}int main(){    int ncase, n, e;    scanf("%d",&ncase);    while(ncase--)    {     scanf("%d %d",&n, &e);     camp(n,e);    }   system("pause");   return 0;}


原创粉丝点击