• Necklace (全排列 + 匈牙利)


    #include<bits/stdc++.h>
    using namespace std;
    
    bool noway[20][20], Gra[20][20];
    int arr[20];
    
    int linker[20];
    bool used[20];
    bool dfs(int u, int vN) {
        for(int v = 1; v <= vN; v++)
            if(Gra[u][v] && !used[v]) {
                used[v] = true;
                if(linker[v] == -1 || dfs(linker[v], vN)) {
                    linker[v] = u;
                    return true;
                }
            }
        return false;
    }
    int hungary(int vN) {
        int res = 0;
        memset(linker,-1,sizeof(linker));
        for(int u = 1; u <= vN; u++) {
            memset(used,false,sizeof(used));
            if(dfs(u, vN))
                res++;
        }
        return vN - res;
    }
    
    int solve(int n) {
        memset(Gra, true, sizeof(Gra));
        for(int i = 2; i <= n; i ++)
            for(int j = 1; j <= n; j ++)
                if(noway[arr[i - 1]][j] || noway[arr[i]][j])
                    Gra[i][j] = false;
        for(int i = 1; i <= n; i ++)
            if(noway[arr[1]][i] || noway[arr[n]][i])
                Gra[1][i] = false;
        return hungary(n);
    }
    
    int main() {
        int n,m,a,b;
        while(~scanf("%d%d",&n,&m)) {
            if(n == 0){
                printf("0
    ");
                continue;
            }
            memset(noway, false, sizeof(noway));
            for(int i = 0; i < m; i ++) {
                scanf("%d%d",&a,&b);
                noway[b][a] = true;
            }
            int ans = 10000;
            for(int i = 1; i <= n; i ++) arr[i] = i;
            do {
                ans = min(solve(n), ans);
            } while(next_permutation(arr + 2, arr + n + 1));
            printf("%d
    ",ans);
        }
        return 0;
    }
    more crazy more get!
  • 相关阅读:
    Python的简单介绍/解释器/变量/变量的数据类型/用户交互及流程控制(if)
    变量
    hello python
    页面默认值显示
    java 获取时间区间
    java Set 中 removeAll 与 addAll
    命名的数据库实例
    linux 打包与解包
    缓存工作原理
    java 格式化日期(转)
  • 原文地址:https://www.cnblogs.com/wethura/p/9727294.html
Copyright © 2020-2023  润新知