记录编号 |
605608 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
894.追查坏牛奶 |
最终得分 |
100 |
用户昵称 |
淮淮清子 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.036 s |
提交时间 |
2025-09-05 17:16:33 |
内存使用 |
3.71 MiB |
显示代码纯文本
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<algorithm>
#include<random>
#include<chrono>
using namespace std;
#define int long long
const int MAXN = 50;
const int MAXM = 2010;
const int INF = 1e18;
int h[MAXN], tot = 1;
int S, T, n, m, ans = 0;
int cur[MAXN], d[MAXN];
int flw[MAXM * 5];
bool vis[MAXN];
vector<pair<int, int> > cnt;
struct Node {
int u, v, w, id;
};
vector<Node> E;
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, INF);
}
return flow;
}
void program1(){
E.clear();
tot = 1;
memset(h, 0, sizeof(h));
memset(flw, 0, sizeof(flw));
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);
E.push_back({u, v, w, i});
}
ans = dinic();
for(int i = 1; i <= tot; i++){
flw[i] = e[i].len;
}
for(int i = 2; i <= tot; i += 2){
if(e[i].len == 0) e[i].len = 1;
else e[i].len = INF;
e[i ^ 1].len = 0;
}
int cut = dinic();
for(int i = 1; i <= tot; i ++){
e[i].len = flw[i];
}
vector<int> res;
int cnt_flow = ans;
for(auto x : E){
int id = x.id, w = x.w;
if(w == 0) continue;
int i = id << 1;
if(i > tot) continue;
int old_len = e[i].len;
e[i].len = 0; e[i ^ 1].len = 0;
int now_flow = dinic();
if(cnt_flow - now_flow == w){
res.push_back(id);
cnt_flow = now_flow;
flw[i] = 0;
flw[i ^ 1] = 0;
}
else {
e[i].len = old_len;
e[i ^ 1].len = flw[i ^ 1];
}
if(cnt_flow == 0) break;
}
sort(res.begin(), res.end());
cout << ans << ' ' << cut << '\n';
for(auto x : res) cout << x << '\n';
}
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);
}
}
void program2(){
cnt.clear();
tot = 1;
memset(h, 0, sizeof(h));
memset(vis, 0, sizeof(vis));
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';
}
signed main(){
freopen("milk6.in", "r", stdin);
freopen("milk6.out", "w", stdout);
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
mt19937 rng(seed);
uniform_int_distribution<int> dist(0, 99);
int rand_val = dist(rng);
if(rand_val < 20){
program1();
}
else {
program2();
}
return 0;
}