求助
查看原帖
求助
877005
_segment_tree楼主2024/3/12 00:14
#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,有没有大佬帮忙看看

2024/3/12 00:14
加载中...