题解 | #欧拉回路#

欧拉回路

https://www.nowcoder.com/practice/0ba5d8f525494a8787aaa9d53b5f9b9e

#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int g[N][N];
int n, m;
//深搜 + 回溯剪枝
bool dfs(int start, int i, int cnt)
{
    if(i == start && cnt == m) return true;
  	bool ret = false;
    for(int j = 1; j <= n && !ret; j ++)
    {
        if(g[i][j])
        {
            g[i][j] = g[j][i] = 0;
            ret |= dfs(start, j, cnt + 1);
            g[i][j] = g[j][i] = 1;    
        }
    }
    return ret;
}
int main() {
    while(cin >> n >> m && n)
    {
        memset(g, 0, sizeof g);
        int i, j;
        for(int k = 0; k < m; k ++)
        {
            cin >> i >> j;
            g[i][j] = g[j][i] = 1;
        }
        bool ret = false;
        for(int k = 1; k <= n && !ret; k ++)
        {
            ret |= dfs(k, k, 0); 
        }
        if(ret) cout << 1 << endl;
        else cout << 0 << endl;
     }

}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务