【PowerOJ1736&网络流24题】飞行员配对方案问题(最小割)

题意:

 

 

 

 n<=100,要求输出方案

思路:准备把没刷的24题从头搞一遍

输出方案的话就在增广的时候记一下另一端的编号就好

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef long double ld;
  7 typedef pair<int,int> PII;
  8 typedef pair<ll,ll> Pll;
  9 typedef vector<int> VI;
 10 typedef vector<PII> VII;
 11 //typedef pair<ll,ll>P;
 12 #define N  300010
 13 #define M  200010
 14 #define INF 1e9
 15 #define fi first
 16 #define se second
 17 #define MP make_pair
 18 #define pb push_back
 19 #define pi acos(-1)
 20 #define mem(a,b) memset(a,b,sizeof(a))
 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 23 #define lowbit(x) x&(-x)
 24 #define Rand (rand()*(1<<16)+rand())
 25 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 26 #define ls p<<1
 27 #define rs p<<1|1
 28 
 29 const ll MOD=1e9+7,inv2=(MOD+1)/2;
 30       double eps=1e-6;
 31       int dx[4]={-1,1,0,0};
 32       int dy[4]={0,0,-1,1};
 33 
 34 int head[N],vet[N],len[N],nxt[N],dis[N],gap[N],x[N],y[N],f[N],s,S,T,tot;
 35 
 36 int read()
 37 {
 38    int v=0,f=1;
 39    char c=getchar();
 40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 42    return v*f;
 43 }
 44 
 45 void add(int a,int b,int c)
 46 {
 47     nxt[++tot]=head[a];
 48     vet[tot]=b;
 49     len[tot]=c;
 50     head[a]=tot;
 51 
 52     nxt[++tot]=head[b];
 53     vet[tot]=a;
 54     len[tot]=0;
 55     head[b]=tot;
 56 }
 57 
 58 int dfs(int u,int aug)
 59 {
 60     if(u==T) return aug;
 61     int e=head[u],val=s-1,flow=0;
 62     while(e)
 63     {
 64         int v=vet[e];
 65         if(len[e])
 66         {
 67             if(dis[u]==dis[v]+1)
 68             {
 69                 int t=dfs(v,min(len[e],aug-flow));
 70                 if(t) f[u]=v;
 71                 len[e]-=t;
 72                 len[e^1]+=t;
 73                 flow+=t;
 74                 if(dis[S]>=s) return flow;
 75                 if(aug==flow) break;
 76             }
 77             val=min(val,dis[v]);
 78         }
 79         e=nxt[e];
 80     }
 81     if(!flow)
 82     {
 83         gap[dis[u]]--;
 84         if(!gap[dis[u]]) dis[S]=s;
 85         dis[u]=val+1;
 86         gap[dis[u]]++;
 87     }
 88     return flow;
 89 }
 90 
 91 int maxflow()
 92 {
 93     rep(i,0,s) gap[i]=0;
 94     rep(i,1,s) dis[i]=0;
 95     gap[0]=s;
 96     int ans=0;
 97     while(dis[S]<s) ans+=dfs(S,INF);
 98     return ans;
 99 }
100 
101 int main()
102 {
103     //freopen("1.in","r",stdin);
104     int m=read(),n=read();
105     rep(i,1,n) head[i]=0;
106     tot=1;
107     int l=1;
108     while(1)
109     {
110         l++;
111         x[l]=read(),y[l]=read();
112         if(x[l]==-1) break;
113         add(x[l],y[l],1);
114     }
115     s=n+m;
116     S=++s;
117     T=++s;
118     rep(i,1,m) add(S,i,1);
119     rep(i,m+1,n) add(i,T,1);
120     int ans=maxflow();
121     if(ans==0)
122     {
123         printf("No Solution!\n");
124         return 0;
125     }
126     printf("%d\n",ans);
127     rep(i,1,m)
128      if(f[i]) printf("%d %d\n",i,f[i]);
129 
130     return 0;
131 }

 

posted on 2019-10-24 18:57  myx12345  阅读(150)  评论(0编辑  收藏  举报

导航