比赛 20250904开学热身赛 评测结果 AWAAAAAAAAWA
题目名称 追查坏牛奶 最终得分 83
用户昵称 淮淮清子 运行时间 0.036 s
代码语言 C++ 内存使用 3.71 MiB
提交时间 2025-09-04 21:59:33
显示代码纯文本
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

#define int long long
const int MAXN = 50;
const int MAXM = 2010;
int h[MAXN], tot = 1;
int S, T, n, m, ans = 0;
int cur[MAXN], d[MAXN];
bool vis[MAXN];
vector<pair<int, int> > cnt;

struct node{
    int to, next, len;
}e[MAXM * 2];

void add(int x, int y, int len){
    e[++ tot] = {y, h[x], len};
    h[x] = tot;
}

bool bfs(){
    memset(d, 0, sizeof(d));
    queue<int> q;
    q.push(S); d[S] = 1;
    while(!q.empty()){
        int u = q.front(); q.pop();
        for(int i = h[u]; i; i = e[i].next){
            int v = e[i].to;
            if(!d[v] && e[i].len > 0){
                d[v] = d[u] + 1; q.push(v);
                if(v == T) return true;
            }
        }
    }
    return false;
}

int dfs(int u, int mf){
    if(u == T) return mf;
    int sum = 0;
    for(int &i = cur[u]; i; i = e[i].next){
        int v = e[i].to;
        if(d[v] == d[u] + 1 && e[i].len > 0){
            int f = dfs(v, min(mf, e[i].len));
            e[i].len -= f; e[i ^ 1].len += f;
            sum += f; mf -= f;
            if(mf == 0) break;
        }
    }
    if(sum == 0) d[u] = 0;
    return sum;
}

int dinic(){
    int flow = 0;
    while(bfs()){
        memcpy(cur, h, sizeof(h));
        flow += dfs(S, 1e18);
    }
    return flow;
}

void dfs2(int u){
    vis[u] = true;
    for(int i = h[u]; i; i = e[i].next){
        int v = e[i].to;
        if(!vis[v] && e[i].len > 0) dfs2(v);
    }
}

signed main(){
	freopen("milk6.in", "r", stdin);
	freopen("milk6.out", "w", stdout);
    cin >> n >> m;
    S = 1; T = n;
    for(int i = 1, u, v, w; i <= m; i ++){
        cin >> u >> v >> w;
        add(u, v, w); add(v, u, 0);
	}
	ans = dinic();
    memset(vis, false, sizeof(vis));
    dfs2(S);
    for(int i = 2; i <= tot; i += 2){
        int u = e[i ^ 1].to, v = e[i].to;
        if(vis[u] && !vis[v] && e[i].len == 0) cnt.push_back({u, i >> 1});
    }
    sort(cnt.begin(), cnt.end(), [&](pair<int, int> a,pair<int, int> b){return a.second < b.second;});
    cout << ans << ' ' << cnt.size() << '\n';
    for(auto x : cnt) cout << x.second << '\n';
    return 0;
}