1049 - One Way Roads 观察 dfs
2024-08-30 00:16:20
http://lightoj.com/volume_showproblem.php?problem=1049
题意是,在一副有向图中,要使得它变成一个首尾相连的图,需要的最小代价。
就是本来是1-->2 2-->3 1--->3的,变成1-->2-->3--->1的话,需要把1-->3变成3--->1,就要耗费这条边的代价
思路就是找出一个入度为2的点,要么往上走,要么往下走,dfs两次。
或者记录一个总和,dfs一次就好,上一次没耗费的,正是向下走要耗费的
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = + ;
struct node {
int u, v, w, tonext;
bool flag;
} e[maxn * ];
int first[maxn];
int num;
int in[maxn];
int DFN;
void add(int u, int v, int w, bool flag) {
++num;
e[num].u = u;
e[num].v = v;
e[num].w = w;
e[num].tonext = first[u];
first[u] = num;
e[num].flag = flag;
}
int now;
int dfs(int cur, int root, int fa) {
if (cur == root && now == ) return ;
if (cur == root) {
for (int i = first[cur]; i; i = e[i].tonext) {
now--;
if (now == ) {
return e[i].w + dfs(e[i].v, root, cur);
}
}
} else {
for (int i = first[cur]; i; i = e[i].tonext) {
int v = e[i].v;
if (v == fa) continue;
if (e[i].flag) {
return dfs(v, root, cur);
} else {
return e[i].w + dfs(v, root, cur);
}
}
}
}
void work() {
num = ;
++DFN;
int n;
scanf("%d", &n);
int root = -inf;
for (int i = ; i <= n; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
if (in[v] == DFN) {
root = v;
}
in[v] = DFN;
add(u, v, w, true);
add(v, u, w, false);
}
int ans = inf;
if (root == -inf) {
ans = ;
} else {
now = ;
ans = dfs(root, root, );
now = ;
ans = min(ans, dfs(root, root, ));
}
static int f = ;
printf("Case %d: %d\n", ++f, ans);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
最新文章
- 大BOSS随时都会到来
- 扩展KMP算法
- HTML5 图片缩放功能
- cat /proc/devices 和ls /dev
- linux框架之ibus
- C/C++中static关键字详解-zz
- Canny边缘检测-Wiki
- hadoop文件系统浅析
- [node] node 版本更新
- kindeditor编辑器修改文本后保存时发现获取到的内容还是修改前的文本内容
- windows下ruby中显示中文的3种方法
- 接口调用(发送http请求)
- gRPC学习
- eclipse 打开时一闪而过解决办法
- C++入门程序作业3
- OpenCV-Python 中文教程(搬运)目录
- [原]Veracrypt使用Yubikey作为安全令牌
- git各种撤销提交
- DHCP机制
- 跟哥走,带你玩转Surface 2
热门文章
- ZOJ 3874 Permutation Graph 分治NTT
- Mac OS用minikube安装单节点kubernetes
- kbmMW 5.0.1发布了(跨全平台,包括Linux,可使用Win的高性能HTTPSys传输层,等等)
- 牛客练习赛42 E.热爆了
- HDU1693 Eat the Trees —— 插头DP
- LoadRunner检查点使用小结
- MYSQL进阶学习笔记五:MySQL函数的创建!(视频序号:进阶_13)
- HDU - 1269 迷宫城堡(有向图的强连通分量)
- 书写优雅的shell脚本(三) - shell中exec解析
- I.MX6 MAC地址修改