比赛 |
20250904开学热身赛 |
评测结果 |
AAWTTTWTTWAA |
题目名称 |
追查坏牛奶 |
最终得分 |
33 |
用户昵称 |
LikableP |
运行时间 |
10.613 s |
代码语言 |
C++ |
内存使用 |
1.56 MiB |
提交时间 |
2025-09-04 21:58:46 |
显示代码纯文本
#include <cstdio>
#include <cstring>
const int MAXN = 35;
const int MAXM = 1010;
struct EDGE {
int v, w, next;
} edge[MAXM];
int head[MAXN], edgeNum;
void AddEdge(int u, int v, int w) {
edge[++edgeNum] = {v, w, head[u]};
head[u] = edgeNum;
}
int k;
int del[MAXM], deleted[MAXM];
int ans[MAXM], cost = 0x7fffffff;
int que[MAXN], front, tail;
bool vis[MAXN];
int end;
void check() {
// printf("[");
// for (int i = 1; i <= k; ++i) {
// printf("%d%c", del[i], " ]"[i == k]);
// }
// printf("\n");
memset(deleted, 0, sizeof deleted);
for (int i = 1; i <= k; ++i) {
deleted[del[i]] = 1;
}
memset(vis, 0, sizeof vis);
front = tail = 0;
que[++tail] = 1;
bool canreach = false;
while (front != tail) {
int u = que[++front];
if (u == end) {
canreach = true;
break;
}
vis[u] = 1;
// printf("{\n");
// printf("\tu = %d\n", u);
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (vis[v] || deleted[i]) continue;
// printf("\tedgeid = %d, v = %d\n", i, v);
que[++tail] = v;
}
// printf("\n}\n");
}
if (!canreach) {
int ncost = 0;
for (int i = 1; i <= k; ++i) {
ncost += edge[del[i]].w;
}
if (ncost < cost) {
cost = ncost;
for (int i = 1; i <= k; ++i) {
ans[i] = del[i];
}
}
}
}
void dfs(int now) {
if (now == k + 1) {
return check();
}
for (int i = del[now - 1] + 1; i <= edgeNum; ++i) {
del[now] = i;
dfs(now + 1);
}
}
int n, m;
int main() {
freopen("milk6.in", "r", stdin);
freopen("milk6.out", "w", stdout);
scanf("%d %d", &n, &m);
end = n;
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
AddEdge(u, v, w);
}
for (k = 1; k <= m; ++k) {
// printf("[k = %d]\n", k);
del[0] = 0;
dfs(1);
if (cost != 0x7fffffff) {
printf("%d %d\n", cost, k);
for (int i = 1; i <= k; ++i) {
printf("%d\n", ans[i]);
}
return 0;
}
}
return 0;
}