zoukankan      html  css  js  c++  java
  • [题解]P2756|飞行员配对方案问题

    题目链接

    飞行员配对方案问题

    考虑每一个飞行员,最多仅可以驾驶一架飞机,一队关系也仅能使用一次,所以

    对于外籍飞行员(i:sxrightarrow{1} i)

    对于英国飞行员(j:jxrightarrow{1} t)

    对于一组关系(i,j:ixrightarrow{1} j)

    (s)(t) 跑最大流记录路径即可

    (after) 数组记录一个点的后继

    (因为题里输入的(i)(j)一定不相等,所以说也可以当成二分图跑最大匹配,对于飞行员记录匹配点即可)

    (mathcal{Code}:)

    #include<queue>
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define N 100010
    #define int long long
    #define debug cout<<__LINE__<<" "<<__FUNCTION__<<"
    "
    inline int read(){
    	int x=0,y=1;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	return x*y;
    }
    int n,m,s,t,dep[N];
    int head[N],tot=1,front,used[N];
    int ans;
    int after[N];
    struct Node{
        int nxt,to,dis;
    }edge[N<<2];
    inline void add(int x,int y,int z){
        edge[++tot].nxt=head[x];
        edge[tot].to=y;
        edge[tot].dis=z;
        head[x]=tot;
    }
    queue<int> q;
    inline int bfs(){
    	register int i;
    	for(i=0;i<=n+1;i++) dep[i]=-1, used[i]=head[i];
    	dep[s]=0;
    	q.push(s);
    	while(!q.empty()){
    		front=q.front();q.pop();
    //		cout<<front<<" ";debug;
    		for(i=head[front];i;i=edge[i].nxt){
    			if(edge[i].dis&&dep[edge[i].to]==-1){
    				dep[edge[i].to]=dep[front]+1;q.push(edge[i].to);
    			}
    		}
    	}
    //	debug;
    	return dep[t]!=-1;
    }
    int dfs(int now,int limit){
    	if(!limit||now==t) return limit;
    	int flow=0;
    	for(int &i=used[now],pro;i;i=edge[i].nxt){
    		if(dep[edge[i].to]==dep[now]+1&&edge[i].dis){
    			pro=dfs(edge[i].to,min(limit,edge[i].dis));
    			if(!pro) continue;
    			edge[i].dis-=pro;
    			edge[i^1].dis+=pro;
    			flow+=pro;
    			limit-=pro;
    			after[now]=edge[i].to;//记录路径
    			if(!limit) return flow;
    		}
    	}
    //	cout<<flow<<" ";debug;
    //	system("pause");
    	return flow;
    }
    inline void Dinic(){
    	while(bfs()){ans+=(dfs(s,10000000001LL));}
    }
    signed main(){
    //	freopen("a.in","r",stdin);
    //	freopen(".out","w",stdout);
    	m=read();n=read();
    	s=0;t=n+1;
    	for(int i=1;i<=m;i++) add(s,i,1),add(i,s,0);
    	for(int i=m+1;i<=n;i++) add(i,t,1),add(t,i,0);
    	int x=read(),y=read();
    	while(x!=-1&&y!=-1){
    		add(x,y,1);add(y,x,0);
    		x=read();y=read();
    	}
    	Dinic();
    	if(ans==0){//无解情况
    		puts("No Solution!");return 0;
    	}
    	cout<<ans<<"
    ";
    	for(int i=1;i<=m;i++){
    		if(after[i]){
    			cout<<i<<" "<<after[i]<<"
    ";
    		}
    	}
    //	fclose(stdin);
    //	fclose(stdout);
    	return 0;
    }
    
    
  • 相关阅读:
    MySQL中的char与varchar详解
    有关PHPstorm的git环境的配置和git密钥的生成总结
    PHP开发中常用的字符串操作函数
    PHP 二维数组排序函数的应用 array_multisort()
    大龄程序员的出路在哪里
    近期面试总结(PHP后端开发工程师)(部分笔试题)
    B-Tree目录和Hash索引的区别
    curl、fopen和file_get_contents区别
    什么是OAuth授权
    SEO 统计算法
  • 原文地址:https://www.cnblogs.com/zh-dou/p/11535767.html
Copyright © 2011-2022 走看看