#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;
}
Matrix Decompressing UVA - 11082
猜你喜欢
转载自blog.csdn.net/qq_36424540/article/details/80644770
今日推荐
周排行