边的容量为各个城市最终的士兵数量
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <queue>
#define maxn 100005
#define INF 1000000009
#define MOD 1000000007
typedef long long ll;
using namespace std;
struct Edge{
Edge(){
}
Edge(int a, int b, int c, int d){
from = a;
to = b;
flow = c;
cap = d;
}
int from, to, flow, cap;
};
vector<Edge> edge;
vector<int> v[305];
int n, m, a[105], ans[105][105], vis[305], pre[305], sum, sum2;
void Add(int k1, int k2, int p){
edge.push_back(Edge(k1, k2, 0, p));
edge.push_back(Edge(k2, k1, 0, 0));
int s = edge.size();
v[k1].push_back(s-2);
v[k2].push_back(s-1);
}
bool MaxFlow(){
int ss = 0;
while(1){
queue<int> q;
q.push(0);
memset(vis, 0, sizeof(vis));
vis[0] = 1e9;
pre[0] = -1;
while(!q.empty()){
int h = q.front();
q.pop();
for(int i = 0; i < v[h].size(); i++){
Edge e = edge[v[h][i]];
if(vis[e.to] == 0 && e.cap > e.flow){
vis[e.to] = min(vis[e.from], e.cap - e.flow);
q.push(e.to);
//printf("%d\n", e.to);
pre[e.to] = v[h][i];
}
}
if(vis[2*n+1])
break;
}
if(vis[2*n+1] == 0)
break;
ss += vis[2*n+1];
for(int j = pre[2*n+1]; j != -1; j = pre[edge[j].from]){
edge[j].flow += vis[2*n+1];
edge[j^1].flow -= vis[2*n+1];
}
}
if(ss == sum)
return true;
return false;
}
int main(){
// freopen("in.txt", "r", stdin);
int k1, k2;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", a+i);
sum += a[i];
}
for(int i = 1; i <= n; i++){
scanf("%d", &k1);
Add(i+n, 2*n+1, k1);
sum2 += k1;
}
if(sum != sum2){
puts("NO");
return 0;
}
for(int i = 0; i < m; i++){
scanf("%d%d", &k1, &k2);
Add(k1, k2+n, a[k1]);
Add(k2, k1+n, a[k2]);
}
for(int i = 1; i <= n; i++){
Add(0, i, a[i]);
Add(i, i+n, a[i]);
}
if(MaxFlow()){
puts("YES");
for(int i = 1; i <= n; i++){
for(int j = 0; j < v[i].size(); j++){
int h = v[i][j];
if(edge[h].to){
ans[i][edge[h].to-n] += edge[h].flow;
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(j > 1)
putchar(' ');
printf("%d", ans[i][j]);
}
puts("");
}
}
else{
puts("NO");
}
return 0;
}