Matrix Decompressing UVA - 11082


#include<cstdio>
#include<algorithm>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=100;

int v1[maxn],v2[maxn];

struct Edge{
	int from,to,cap,flow;
	Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){	}
};
/*
很好的题,感觉很形象,就像是交错的管道,只知道流入的流量
流出的流量,中间的交叉口就是两个点之间的流量
还有就是怎样来保证所有的树不为0,是直接把所有的数字
都减掉1,这样的话,就算有的边流量是0,也没有问题了 
*/

struct EK{
	int n,m;
	vector<Edge> edges;
	vector<int> G[maxn];
	
	void init(int n){
		for(int i=0;i<n;i++)G[i].clear();
		edges.clear();
	}
	
	void add_edge(int u,int v,int c){
		edges.push_back(Edge(u,v,c,0));
		edges.push_back(Edge(v,u,0,0));
		m=edges.size();
		G[u].push_back(m-2);
		G[v].push_back(m-1);
	}
	int a[maxn],p[maxn];
	int  Maxflow(int s,int t){
		int flow=0;
		for(;;){
			memset(a,0,sizeof(a));
			memset(p,0,sizeof(p));
			queue<int> q;
			q.push(s);
			a[s]=inf;
			while(!q.empty()){
				int x=q.front();q.pop();
				for(int i=0;i<G[x].size();i++){
					int to=G[x][i];
					Edge& e=edges[to];
					if(!a[e.to]&&e.cap>e.flow){
						a[e.to]=min(a[x],e.cap-e.flow); 
						p[e.to]=G[x][i];
						q.push(e.to);
					}
				}
				if(a[t])break;
			}
			if(!a[t])break;
			for(int u=t;u!=s;u=edges[p[u]].from){
				edges[p[u]].flow+=a[t];
				edges[p[u]^1].flow-=a[t];
			}
			flow+=a[t];
		}
		return flow;
	} 
}ek;
int ans[maxn][maxn];
int main(){
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	for(int kase=1;kase<=T;kase++){
		int n,m;
		cin>>n>>m;
		ek.init(n+m+2);
		int st=0,ed=n+m+1;
		
		for(int i=1;i<=n;i++){
			cin>>v1[i];
			ek.add_edge(st,i,v1[i]-v1[i-1]-m);
		}
		for(int i=1;i<=m;i++){
			cin>>v2[i];
			ek.add_edge(n+i,ed,v2[i]-v2[i-1]-n);
		}

		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				ek.add_edge(i,n+j,19);
			}
		}
		
		int tmp= ek.Maxflow(st,ed);
		
		//
		//cout<<"tmp"<<tmp<<endl;
		
		for(int i=1;i<=n;i++){
			for(int j=0;j<ek.G[i].size();j++){
				Edge& e=ek.edges[ek.G[i][j]];
				if(e.to>n&&e.to<ed){
					ans[i][e.to-n]=e.flow+1;
				}
			}
		}
		
		if(kase>1)cout<<endl;
		cout<<"Matrix "<<kase<<endl;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(j==1) cout<<ans[i][j];
				else cout<<" "<<ans[i][j];
			}
			cout<<endl;
		}
	}	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/80644770
今日推荐