只会cv怎么办 2021-09-13 11:46 采纳率: 82.4%
浏览 63
已结题

这道题没有思路,能帮帮忙看一下嘛

img


请问这道题该怎么做呀,有什么思路?
如果能写出来代码就更好了,谢谢

  • 写回答

1条回答 默认 最新

  • Admini$trat0r .net领域新星创作者 2021-09-13 11:57
    关注
    
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int N, M;
    bool vis[111];
    int g[111][111];
    
    bool dfs(int s, int t)
    {
        vis[s] = 1;
        if (s == t) return 1;
        for (int u = 0; u < N; ++u)
        {
            if (!g[s][u] || vis[u]) continue;
            if (dfs(u, t)) return 1;
        }
        return 0;
    }
    
    bool cyc(int u)
    {
        bool res;
        for (int v = 0; v < N; ++v)
        {
            if (!g[u][v]) continue;
            g[u][v]--; g[v][u]--;
            memset(vis, 0, sizeof(vis));
            res = dfs(u, v);
            g[u][v]++; g[v][u]++;
            if (res) return 1;
        }
        return 0;
    }
    
    bool hmr(int u)
    {
        memset(vis, 0, sizeof(vis));
        if (!dfs(0, u)) return 0;
        int x = g[0][u];
        g[0][u] = g[u][0] = 0;
        memset(vis, 0, sizeof(vis));
        if (x&1 || dfs(0, u))
        {
            g[0][u] = g[u][0] = x;
            return 1;
        }
        bool res = cyc(0)||cyc(u);
        g[0][u] = g[u][0] = x;
        return res;
    }
    
    
    int main()
    {
        int i, j, k, u, v;
        cin >> N >> M;
        while (M--)
        {
            cin >> u >> v;
            u--; v--;
            g[u][v]++; g[v][u]++;
        }
        bool mdk = 1;
        for (u = 1; u<N && mdk; ++u)
            if (g[0][u]) mdk = 0;
        int syk = 0;
        for (u = 1; u<N && !mdk; ++u)
        {
            if (!g[0][u]) continue;
            int x = g[0][u];
            if ((x&1)==0)
            {
                mdk = 1;
                break;
            }
            g[0][u] = g[u][0] = 0;
            memset(vis, 0, sizeof(vis));
            if (dfs(0, u))
            {
                g[0][u] = g[u][0] = x;
                mdk = 1;
                break;
            }
            if (x>1 && cyc(u)) mdk = 1;
            g[0][u] = g[u][0] = x;
            if (x>1) syk++;
        }
        mdk |= (syk>=2);
        if (mdk) cout<<"1 ";
        for (u = 1; u < N; ++u)
            if (hmr(u)) printf("%d ", u+1);
        cout << endl;
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 9月13日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测