zoukankan      html  css  js  c++  java
  • 2020/8/30

    英语四级一篇

    四题网络流 真就万物建模

    一场cf

     

     

    #include"stdio.h"
    #include"string.h"
    #include"stack"
    #include"map"
    #include"math.h"
    #include"iostream"
    #include"vector"
    #include"queue"
    #include"algorithm"
    using namespace std;
    #define OK printf("
    ");
    #define Debug printf("this_ok
    ");
    #define INF 1e18
    typedef long long ll;
    #define scanll(a,b) scanf("%lld%lld",&a,&b);
    #define scanl(a) scanf("%lld",&a);
    #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld
    ",a);
    #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d
    ",a);
    typedef pair<int,int> PII;
    
    inline int read(){
        int s = 0, w = 1; char ch = getchar();
        while(ch < '0' || ch > '9')   { if(ch == '-') w = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); }
        return s * w;
    }
    const ll mod = 998244353;
    const int N = 50010,M = 300010;
    const  double pi = acos(-1);
    const int inf = 1 << 29;
    const int dirx[4] = {-1,0,1,0};
    const int diry[4] = {0,1,0,-1};
    int n,m,t,s,tot;
    ll maxflow,sum;
    int head[N],ver[M],Next[M],edge[M],d[N];
    queue<int> q;
    int visit[N];
    vector<int> st,tmp;
    
    void add(int x,int y,int z){
        ver[++ tot] = y; Next[tot] = head[x];  edge[tot] = z; head[x] = tot;
        ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot;
    }
    
    bool bfs(){
        memset(d,0,sizeof(d));
        while(q.size())q.pop();
        q.push(s); d[s] = 1;
        while(q.size()){
            int x = q.front(); q.pop();
            for(int i = head[x]; i; i = Next[i])
            if(edge[i] && !d[ver[i]]){
                q.push(ver[i]); d[ver[i]] = d[x] + 1;
                if(ver[i] == t) return 1;
            }
        }
        return 0;
    }
    
    int dinic(int x,ll flow){
        if(x == t) return flow;
        ll rest = flow,k;
        for(int i = head[x]; i && rest; i = Next[i]){
             if(edge[i] && d[ver[i]] == d[x] + 1){
                k = dinic(ver[i],min(rest,(ll)edge[i]));
                if(!k) d[ver[i]] = 0;
                edge[i] -= k;
                edge[i ^ 1] += k;
                rest -= k;
             }
        }
        return flow - rest;
    }
    void dfs(int x){
        tmp.push_back(x);
        for(int i = head[x]; i ;i = Next[i]){
            int y = ver[i];
            if(y > n && y < s && !visit[y - n] && !edge[i]){
               visit[y - n] = 1;
               dfs(y - n);
            }
        }
    }
    int main(){
        n = read(),m = read();s = 2 * n + 1; t = 2 * n + 2;
        tot = 1;
        for(int i = 1; i <= n; i ++){
          //add(i,i + n,1);
          add(s,i,1); add(i + n,t,1);
        }
        for(int i = 1; i <= m; i ++){
            int x = read(),y = read();
            add(x,y + n,1);
        }
    
        ll flow = 0;
        while(bfs())
            while(flow = dinic(s,inf)) maxflow += flow;
        
    
        for(int i = n + 1; i <= n + n; i ++){
            for(int j = head[i]; j; j = Next[j]){
                if(ver[j] == t && edge[j]) st.push_back(i - n);
            }
        }
        //printf("dsf");
        for(int i = 0; i < st.size(); i ++){
          //  printf("%d x",st[i]);
            tmp.clear();
            visit[st[i]] = 1;
            dfs(st[i]);
            for(int j = 0; j < tmp.size(); j ++){
                printf("%d ",tmp[j]);
            }
            printf("
    ");
        }
        printf("%lld
    ",n - maxflow);
    }
    /*
    3
    1 2 3
    2
    2 6
    */
    
    #include"stdio.h"
    #include"string.h"
    #include"stack"
    #include"map"
    #include"math.h"
    #include"iostream"
    #include"vector"
    #include"queue"
    #include"algorithm"
    using namespace std;
    #define OK printf("
    ");
    #define Debug printf("this_ok
    ");
    #define INF 1e18
    typedef long long ll;
    #define scanll(a,b) scanf("%lld%lld",&a,&b);
    #define scanl(a) scanf("%lld",&a);
    #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld
    ",a);
    #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d
    ",a);
    typedef pair<int,int> PII;
    
    inline int read(){
        int s = 0, w = 1; char ch = getchar();
        while(ch < '0' || ch > '9')   { if(ch == '-') w = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); }
        return s * w;
    }
    const ll mod = 998244353;
    const int N = 50010,M = 300010;
    const  double pi = acos(-1);
    const int inf = 1 << 29;
    const int dirx[4] = {-1,0,1,0};
    const int diry[4] = {0,1,0,-1};
    int n,m,t,s,tot;
    ll maxflow,sum;
    int head[N],ver[M],Next[M],edge[M],d[N];
    queue<int> q;
    
    void add(int x,int y,int z){
        ver[++ tot] = y; Next[tot] = head[x];  edge[tot] = z; head[x] = tot;
        ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot;
    }
    
    bool bfs(){
        memset(d,0,sizeof(d));
        while(q.size())q.pop();
        q.push(s); d[s] = 1;
        while(q.size()){
            int x = q.front(); q.pop();
            for(int i = head[x]; i; i = Next[i])
            if(edge[i] && !d[ver[i]]){
                q.push(ver[i]); d[ver[i]] = d[x] + 1;
                if(ver[i] == t) return 1;
            }
        }
        return 0;
    }
    
    int dinic(int x,ll flow){
        if(x == t) return flow;
        ll rest = flow,k;
        for(int i = head[x]; i && rest; i = Next[i]){
             if(edge[i] && d[ver[i]] == d[x] + 1){
                k = dinic(ver[i],min(rest,(ll)edge[i]));
                if(!k) d[ver[i]] = 0;
                edge[i] -= k;
                edge[i ^ 1] += k;
                rest -= k;
             }
        }
        return flow - rest;
    }
    int main(){
        n = read(),m = read();s = n + m + 1; t = s + 1;
        tot = 1; int ans = 0;
        for(int i = 1; i <= n; i ++){
            for(int j = 1; j <= m; j ++){
                add(i,j + n,1);
            }
        }
        for(int i = 1; i <= n; i ++){
            int x = read(); add(s,i,x); ans += x;
        }
        for(int i = 1; i <= m; i ++){
            int x = read();add(i + n,t,x);
        }
    
        ll flow = 0;
        while(bfs())
            while(flow = dinic(s,inf)) maxflow += flow;
        if(maxflow != ans){
            printf("0
    "); return 0;
        }
        printf("1
    ");
        for(int i = 1; i <= n; i ++){
            for(int j = head[i]; j; j = Next[j]){
                if(edge[j] == 0){
                    printf("%d ",ver[j] - n);
                }
            }
            printf("
    ");
        }
    }
    /*
    3
    1 2 3
    2
    2 6
    */
    
    #include"stdio.h"
    #include"string.h"
    #include"stack"
    #include"map"
    #include"math.h"
    #include"iostream"
    #include"vector"
    #include"queue"
    #include"algorithm"
    using namespace std;
    #define OK printf("
    ");
    #define Debug printf("this_ok
    ");
    #define INF 1e18
    typedef long long ll;
    #define scanll(a,b) scanf("%lld%lld",&a,&b);
    #define scanl(a) scanf("%lld",&a);
    #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld
    ",a);
    #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d
    ",a);
    typedef pair<int,int> PII;
    
    inline int read(){
        int s = 0, w = 1; char ch = getchar();
        while(ch < '0' || ch > '9')   { if(ch == '-') w = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); }
        return s * w;
    }
    const ll mod = 998244353;
    const int N = 50010,M = 300010;
    const  double pi = acos(-1);
    const int inf = 1 << 29;
    const int dirx[4] = {-1,0,1,0};
    const int diry[4] = {0,1,0,-1};
    int n,m,t,s,tot,k;
    ll maxflow,sum;
    int head[N],ver[M],Next[M],edge[M],d[N];
    queue<int> q;
    vector<int> st[N];
    
    void add(int x,int y,int z){
        ver[++ tot] = y; Next[tot] = head[x];  edge[tot] = z; head[x] = tot;
        ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot;
    }
    
    bool bfs(){
        memset(d,0,sizeof(d));
        while(q.size())q.pop();
        q.push(s); d[s] = 1;
        while(q.size()){
            int x = q.front(); q.pop();
            for(int i = head[x]; i; i = Next[i])
            if(edge[i] && !d[ver[i]]){
                q.push(ver[i]); d[ver[i]] = d[x] + 1;
                if(ver[i] == t) return 1;
            }
        }
        return 0;
    }
    
    int dinic(int x,ll flow){
        if(x == t) return flow;
        ll rest = flow,k;
        for(int i = head[x]; i && rest; i = Next[i]){
             if(edge[i] && d[ver[i]] == d[x] + 1){
                k = dinic(ver[i],min(rest,(ll)edge[i]));
                if(!k) d[ver[i]] = 0;
                edge[i] -= k;
                edge[i ^ 1] += k;
                rest -= k;
             }
        }
        return flow - rest;
    }
    int main(){
        m = read(),n = read();s = n + m + 1; t = s + 1; tot = 1;
        int ans = 0;
        for(int i = 1; i <= m; i ++){
            int x = read(); add(i + n,t,x);
            ans += x;
        }
        for(int i = 1; i <= n; i ++){
            add(s,i,1);
        }
        for(int i = 1; i <= n; i ++){
            int k = read();
            while(k --){
                int x = read();
                add(i,x + n,1);
            }
        }
        ll flow = 0;
        while(bfs())
            while(flow = dinic(s,inf)) maxflow += flow;
        if(maxflow != ans) printf("No Solution!
    ");
        else {
            for(int i = 1; i <= m; i ++){
                printf("%d:",i);
                for(int x = 1; x <= n; x ++){
    
                    for(int j = head[x]; j; j = Next[j]){
                         if(ver[j] != i + n) continue;
                         if(edge[j]) continue;
                         if(ver[j] == s || ver[j] == t) continue;
                         printf(" %d",x);
                    }
                }
                printf("
    ");
            }
        }
    }
    /*
    3
    1 2 3
    2
    2 6
    */
    
    #include"stdio.h"
    #include"string.h"
    #include"stack"
    #include"map"
    #include"math.h"
    #include"iostream"
    #include"vector"
    #include"queue"
    #include"algorithm"
    using namespace std;
    #define OK printf("
    ");
    #define Debug printf("this_ok
    ");
    #define INF 1e18
    typedef long long ll;
    #define scanll(a,b) scanf("%lld%lld",&a,&b);
    #define scanl(a) scanf("%lld",&a);
    #define printl(a,b) if(b == 0) printf("%lld ",a); else printf("%lld
    ",a);
    #define print_int(a,b) if(b == 0) printf("%d ",a); else printf("%d
    ",a);
    typedef pair<int,int> PII;
    
    inline int read(){
        int s = 0, w = 1; char ch = getchar();
        while(ch < '0' || ch > '9')   { if(ch == '-') w = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9') { s = (s << 3) + (s << 1) + (ch ^ 48); ch = getchar(); }
        return s * w;
    }
    const ll mod = 998244353;
    const int N = 50010,M = 300010;
    const  double pi = acos(-1);
    const int inf = 1 << 29;
    int n,m,t,s,tot;
    ll maxflow,sum;
    int head[N],ver[M],Next[M],edge[M],d[N];
    queue<int> q;
    
    void add(int x,int y,int z){
        ver[++ tot] = y; Next[tot] = head[x];  edge[tot] = z; head[x] = tot;
        ver[++ tot] = x; edge[tot] = 0; Next[tot] = head[y]; head[y] = tot;
    }
    
    bool bfs(){
        memset(d,0,sizeof(d));
        while(q.size())q.pop();
        q.push(s); d[s] = 1;
        while(q.size()){
            int x = q.front(); q.pop();
            for(int i = head[x]; i; i = Next[i])
            if(edge[i] && !d[ver[i]]){
                q.push(ver[i]); d[ver[i]] = d[x] + 1;
                if(ver[i] == t) return 1;
            }
        }
        return 0;
    }
    
    int dinic(int x,ll flow){
        if(x == t) return flow;
        ll rest = flow,k;
        for(int i = head[x]; i && rest; i = Next[i]){
             if(edge[i] && d[ver[i]] == d[x] + 1){
                k = dinic(ver[i],min(rest,(ll)edge[i]));
                if(!k) d[ver[i]] = 0;
                edge[i] -= k;
                edge[i ^ 1] += k;
                rest -= k;
             }
        }
        return flow - rest;
    }
    int main(){
        int T = read();
        int cont = 1;
        while(T --){
            n = read(),m = read();s = 1; t = n;
            memset(head,0,sizeof(head));
            tot = 1;
            for(int i = 1; i <= m; i ++){
             int x = read(),y = read(),w = read();
               add(x,y,w);
            }
            ll flow = 0; maxflow = 0;
            while(bfs())
                while(flow = dinic(s,inf)) maxflow += flow;
            printf("Case %d: ",cont ++);
            printf("%lld
    ",maxflow);
        }
    }
    /*
    3
    1 2 3
    2
    2 6
    */
    

      

  • 相关阅读:
    hdu 1009 贪心算法
    hdu10007
    HDU1005 数列找规律
    HDU1004 (数组元素出现最多)
    HDU1003 dp 动态规划解析
    活字格Web应用平台学习笔记4
    活字格学习
    活字格Web应用平台学习笔记3-显示数据列表
    活字格Web应用平台学习笔记2-基础教程-开始
    活字格Web应用平台学习笔记1
  • 原文地址:https://www.cnblogs.com/yrz001030/p/13587431.html
Copyright © 2011-2022 走看看