• [LUOGU]P3701 主席树(假的)


    有人恶意刷难度。。。就一个最大流模板。。。
    但是题面吼啊2333

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <cstring>
    using namespace std;
    int n,m;
    const int N=505,S=0,T=504;
    char s1[105][10],s2[105][10],ct1,ct2;
    int cnt[5],lif1[105],lif2[105];
    int h[N<<1],ecnt=1,head[N<<1];
    struct Edge {
        int nxt,to,val;
    } e[500*500];
    void add(int bg,int ed,int val) {
        e[++ecnt].nxt=head[bg];
        e[ecnt].to=ed;
        e[ecnt].val=val;
        head[bg]=ecnt;
    }
    void ins(int x,int y,int flow) {
    	add(x,y,flow);
    	add(y,x,0);
    }
    bool bfs() {
        memset(h,-1,sizeof h);
        queue<int>q;
        q.push(S);
        h[S]=0;
        while(!q.empty()) {
            int u=q.front();
            q.pop();
            for(int i=head[u]; i; i=e[i].nxt) {
                int v=e[i].to;
                if(h[v]==-1&&e[i].val) {
                    h[v]=h[u]+1;
                    q.push(v);
                }
            }
        }
        return h[T]!=-1;
    }
    int dfs(int x,int f) {
        if(x==T)return f;
        int used=0,tp;
        for(int i=head[x]; i; i=e[i].nxt) {
            int v=e[i].to;
            if(h[v]-1==h[x]&&e[i].val) {
                tp=dfs(v,min(e[i].val,f-used));
                used+=tp;
                e[i].val-=tp;
                e[i^1].val+=tp;
                if(used==f)return f;
            }
        }
        if(used==0)h[x]=-1;
        return used;
    }
    int maxflow;
    void dinic() {
        maxflow=0;
        while(bfs()) {
            maxflow+=dfs(0,0x3f3f3f3f);
        }
    }
    int main() {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++) 
    		scanf("%s",s1[i]),ct1+=s1[i][0]=='Y'?1:0;
    	for(int i=1;i<=n;i++) 
    		scanf("%s",s2[i]),ct2+=s2[i][0]=='Y'?1:0;
    	for(int i=1;i<=n;i++) 
    		scanf("%d",&lif1[i]),lif1[i]+=s1[i][0]=='J'?ct1:0;
    	for(int i=1;i<=n;i++)
    		scanf("%d",&lif2[i]),lif2[i]+=s2[i][0]=='J'?ct2:0;;
    	for(int i=1;i<=n;i++) {ins(S,i,lif1[i]);ins(i+n,T,lif2[i]);}
    	for(int i=1;i<=n;i++) {
    		for(int j=1;j<=n;j++) {
    			if(s1[i][0]=='J'&&(s2[j][0]=='W'||s2[j][0]=='H')) ins(i,j+n,1);
    			if(s1[i][0]=='E'&&(s2[j][0]=='J'||s2[j][0]=='Y')) ins(i,j+n,1);
    			if(s1[i][0]=='Y'&&(s2[j][0]=='H'||s2[j][0]=='J')) ins(i,j+n,1);
    			if(s1[i][0]=='H'&&(s2[j][0]=='W'||s2[j][0]=='E')) ins(i,j+n,1);
    			if(s1[i][0]=='W'&&(s2[j][0]=='Y'||s2[j][0]=='E')) ins(i,j+n,1);
    		}
    	}
    	dinic();
    	cout<<min(maxflow,m);
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    Java多线程之Wait()和Notify()
    Java多线程之线程结束清理
    Java多线程之阻塞I/O如何中断
    Java多线程之线程中断
    java多线程之计算数量
    深入研究java.lang.ThreadLocal类(转)
    java多线程之ThreadLocal
    java多线程之AtomicInteger
    Java多线程之简单的线程同步实例
    Java多线程之捕获异常
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9343591.html
Copyright © 2020-2023  润新知