#include<iostream>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using std::cin; using std::cout; using std::vector; using std::queue;
const int maxn = 30;
const int inf = 0x3f3f3f3f;
struct edge{
int from, to, flow, cap;
edge(int f, int t, int fl, int c): from(f), to(t), flow(fl), cap(c){}
edge(){}
};
vector<edge> e; int n, m, s, t;
vector<int> g[maxn * maxn];
int d[maxn], now[maxn];
int win[maxn], de[maxn], a[maxn][maxn], contest;
void addedge(int x, int y, int cap){
e.push_back(edge(x, y, 0, cap));
e.push_back(edge(y, x, 0, 0));
int cnt = e.size();
g[x].push_back(cnt - 2); g[y].push_back(cnt - 1);
}
bool bfs(){
queue<int> q;
memset(d, -1, sizeof(d)); memset(now, 0, sizeof(now));
d[s] = 0; q.push(s);
while(!q.empty()){
int u = q.front(); q.pop();
for(const int &v : g[u]){
const edge &ed = e[v];
if(d[ed.to] == -1 && ed.cap > ed.flow){
d[ed.to] = d[u] + 1;
q.push(ed.to);
if(ed.to == t) return true;
}
}
}
return false;
}
int dfs(int u, int sum){
if(u == t) return sum;
int res = 0;
for(int j = now[u]; j < g[u].size() && sum > 0; j++){
now[u] = j;
edge &ed = e[g[u][j]];
if(ed.cap > ed.flow && d[ed.to] == d[u] + 1){
int k = dfs(ed.to, std::min(ed.cap - ed.flow, sum));
if(k == 0) d[ed.to] = -1;
ed.flow += k; e[g[u][j] ^ 1].flow -= k;
res += k; sum -= k;
}
}
return res;
}
int maxflow(){
int res = 0;
while(bfs())
res += dfs(s, inf);
return res;
}
bool check(int u){
e.clear();
for(int k = 0; k < maxn * maxn; k++) g[k].clear();
int total = win[u], flag = 0;
for(int v = 1; v <= n; v++)
total += a[u][v];
contest = n; s = 0;
for(int x = 1; x <= n; x++)
for(int y = x + 1; y <= n; y++)
if(a[x][y] > 0){
int c = ++contest; flag += a[x][y];
addedge(s, c, a[x][y]);
addedge(c, x, inf);
addedge(c, y, inf);
}
t = contest + 1;
for(int v = 1; v <= n; v++)
if(total > win[v])
addedge(v, t, total - win[v]);
else if(total < win[v])
return false;
int f = maxflow();
return f == flag;
};
int main(){
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
std::ios_base::sync_with_stdio(false);
int T; cin >> T;
for(int kase = 1; kase <= T; kase++){
cin >> n;
for(int k = 1; k <= n; k++) cin >> win[k] >> de[k];
for(int u = 1; u <= n; u++)
for(int v = 1; v <= n; v++)
cin >> a[u][v];
bool space = false;
for(int x = 1; x <= n; x++)
if(check(x)){
if(space) cout << ' ' << x;
else{ cout << x; space = true; }
}
cout << '\n';
}
return 0;
}
这份代码总是wa,有没有大佬帮忙看看