zoukankan      html  css  js  c++  java
  • [网络流24题]最小路径覆盖问题

    最小路径覆盖模板题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #define maxn 155
    #define maxm 6005
    using namespace std;
    int n,m;
    struct edge{
        int from;
        int to;
        int next;
    }E[maxm];
    int sz=0;
    int head[maxn];
    void add_edge(int u,int v){
        sz++;
        E[sz].from=u;
        E[sz].to=v;
        E[sz].next=head[u];
        head[u]=sz;
    }
    
    int vis[maxn*2];
    int match[maxn*2];
    int dfs(int x){
        for(int i=head[x];i;i=E[i].next){
            int y=E[i].to;
            if(!vis[y]){
                vis[y]=1;
                if(!match[y]||dfs(match[y])){
                    match[y]=x;
                    match[x]=y;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    void print(int x){
        x+=n;
        do{
            x-=n;
            printf("%d ",x);
            vis[x]=1;
            x=match[x];
        }while(x!=0);
        printf("
    "); 
    }
    int main(){
        int x,y;
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d %d",&x,&y);
            add_edge(x,y+n); 
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            memset(vis,0,sizeof(vis));
            if(dfs(i)) ans++;
        }
        memset(vis,0,sizeof(vis)); 
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                print(i);
            }
        }
        printf("%d
    ",n-ans);
    } 
    
  • 相关阅读:
    5/14 补沙
    5/21 购填缝剂
    5/30 购水不漏
    6/1 购防水
    6/4 补防水
    5/21 人工
    5/7 增购电线
    6/2 补防水
    5/4 瓦工进场
    5/31 补瓷砖
  • 原文地址:https://www.cnblogs.com/birchtree/p/10314605.html
Copyright © 2011-2022 走看看