比赛 SBOI虎年首秀 评测结果 AWWWWWWWWWW
题目名称 最小路径覆盖问题 最终得分 9
用户昵称 yrtiop 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-02-23 20:31:03
显示代码纯文本
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 205;
    const int maxm = 6005;
    int head[maxn],ver[maxm],nxt[maxm],n,m,cnt;
    void add(int u,int v) {
        ver[++ cnt] = v;
        nxt[cnt] = head[u];
        head[u] = cnt;
        return ;
    }
    int cur[maxn],pre[maxn];
    bool vis[maxn];
    bool dfs(int u) {
        for(int i = head[u];i;i = nxt[i]) {
            int v = ver[i];
            if(vis[v])return false;
            vis[v] = true;
            if(!cur[v]||dfs(cur[v])) {
                cur[v] = u;
                pre[u] = v; 
                return true;
            }
        }
        return false;
    }
    int match() {
        int ans = 0;
        memset(cur , 0 , sizeof(cur));
        for(int i = 1;i <= n;++ i)pre[i] = i;
        for(int i = 1;i <= n;++ i) {
            memset(vis , false , sizeof(vis));
            ans += dfs(i);
        }
        return ans;
    }
    int main() {
        freopen("path3.in","r",stdin);
        freopen("path3.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i = 1;i <= m;++ i) {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u , v);
        }
        int ans = match();
        for(int i = 1;i <= n;++ i) {
            if(cur[i])continue ;
            printf("%d ",i);
            for(int x = i;x != pre[x];x = pre[x]) {
                printf("%d ",pre[x]);
            }
            putchar('\n');
        }
        printf("%d",n - ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }