这道题数据太弱了,我用贪心骗了满分,但不会正解,欢迎大家hack,希望出题人加强数据。
#include<bits/stdc++.h>
using namespace std;
long long n;
struct t{
long long a,b,c,d;
}v[1009],u[1009];
bool vis[1009][1009];
bool cmp(t a1,t a2){
return (n-a1.b-a1.c==n-a2.b-a2.c?a1.d>a2.d:n-a1.b-a1.c<n-a2.b-a2.c);
}
bool dfs(long long x,long long y){
if(v[x].a==0){
return dfs(x+1,1);
}
if(x>n){
return 1;
}
for(long long j=y;j<=n;j++){
if(j==x){
continue;
}
if(vis[x][j]){
continue;
}else{
//cout<<v[j].d<<" "<<v[i].d<<" "<<v[j].b<<" "<<v[i].a<<endl;
if(v[j].b&&v[x].a){
v[j].b--;
v[x].a--;
bool kkk;
kkk=0;
if(v[x].a){
kkk=dfs(x,j+1);
}else{
kkk=dfs(x+1,1);
}
if(kkk){
cout<<x<<" "<<j<<endl;
return 1;
}
v[j].b++;
v[x].a++;
}
}
}
return 0;
}
int main(){
long long sum;
sum=0;
cin>>n;
for(long long i=1;i<=n;i++){
cin>>v[i].b;
sum+=v[i].b;
v[i].d=i;
}
for(long long i=1;i<=n;i++){
cin>>v[i].a;
}
long long m;
cin>>m;
for(long long i=1;i<=m;i++){
long long x,y;
cin>>x>>y;
vis[x][y]=1;
v[y].c++;
}
cout<<sum<<endl;
if(n<=10){
if(dfs(1,1))
return 0;
//return 0;
}
for(long long j=1;j<=n;j++){
u[j]=v[j];
}
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
v[j]=u[j];
}
swap(v[1],v[i]);
sort(v+2,v+1+n,cmp);
for(long long j=2;j<=n;j++){
if(vis[v[1].d][v[j].d]){
v[j].c--;
}else{
//cout<<v[j].d<<" "<<v[i].d<<" "<<v[j].b<<" "<<v[i].a<<endl;
if(v[j].b&&v[1].a){
cout<<v[1].d<<" "<<v[j].d<<endl;
v[j].b--;
v[1].a--;
}
}
u[v[j].d]=v[j];
}
}
return 0;
}