UVA663 Sorting Slides / YbtOJ「图论」第1章 二分图匹配 E. 幻灯片 题解--zhengjun

思路

会发现建完二分图之后,就是求哪些边一定在二分图的完全匹配当中的。

那就只需要求出这条边如果去掉,还能不能跑出完全匹配,如果不能了,那么这条边就一定在完全匹配中,否则就不在。

代码

#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N=30;struct edges{int to,c,nex;}edge[N*N*2];vector<int>ans[N];
int T,n,s,t,head[N<<1],kk,d[N<<1],cur[N<<1];struct zj{int x_min,x_max,y_min,y_max;}a[N];struct node{int x,y;}b[N];
bool isin(zj a,node b){return a.x_min<b.x&&b.x<a.x_max&&a.y_min<b.y&&b.y<a.y_max;}
void add(int u,int v,int c){edge[++kk]={v,c,head[u]};head[u]=kk;edge[++kk]={u,0,head[v]};head[v]=kk;}
bool bfs(){
	memset(d,-1,sizeof d);queue<int>q;q.push(s);d[s]=0;cur[s]=head[s];while(!q.empty()){
		int u=q.front();q.pop();for(int i=head[u],v;v=edge[i].to,i;i=edge[i].nex)
			if(d[v]==-1&&edge[i].c)q.push(v),d[v]=d[u]+1,cur[v]=head[v];
	}return d[t]!=-1;
}
int dfs(int u,int lim=1e9){
	if(u==t)return lim;int flow=0;for(int i=cur[u],v;v=edge[i].to,i&&flow<lim;i=edge[i].nex){
		cur[u]=i;if(d[v]!=d[u]+1||!edge[i].c)continue;int f=dfs(v,min(lim-flow,edge[i].c));
		if(!f)d[v]=-1;edge[i].c-=f;edge[i^1].c+=f;flow+=f;
	}return flow;
}
int dinic(){int maxflow=0;while(bfs())maxflow+=dfs(s);return maxflow;}
void clear(){memset(head,0,sizeof head);kk=1;}
bool check(int x,int y){
	clear();if(!isin(a[x],b[y]))return 0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(isin(a[i],b[j])&&(i!=x||j!=y))
		add(i,j+n,1);for(int i=1;i<=n;i++)add(s,i,1);for(int i=1;i<=n;i++)add(i+n,t,1);return dinic()!=n;
}
void get(){
	printf("Heap %d\n",++T);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&a[i].x_min,&a[i].x_max,&a[i].y_min,&a[i].y_max);
	for(int i=1;i<=n;i++)scanf("%d%d",&b[i].x,&b[i].y);for(int i=1;i<=n;i++)ans[i].clear();
	bool flag=0;s=0;t=n+n+1;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(check(i,j))ans[i].push_back(j),flag=1;
	if(!flag)puts("none");else{for(int i=1;i<=n;i++)if(ans[i].size()==1)printf("(%c,%d) ",i+'A'-1,ans[i][0]);puts("");}
}
int main(){
	while(~scanf("%d",&n)&&n)get(),puts("");return 0;
}
posted @ 2022-06-26 18:07  A_zjzj  阅读(2)  评论(0编辑  收藏  举报