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 ;
}

最新文章

  1. 大BOSS随时都会到来
  2. 扩展KMP算法
  3. HTML5 图片缩放功能
  4. cat /proc/devices 和ls /dev
  5. linux框架之ibus
  6. C/C++中static关键字详解-zz
  7. Canny边缘检测-Wiki
  8. hadoop文件系统浅析
  9. [node] node 版本更新
  10. kindeditor编辑器修改文本后保存时发现获取到的内容还是修改前的文本内容
  11. windows下ruby中显示中文的3种方法
  12. 接口调用(发送http请求)
  13. gRPC学习
  14. eclipse 打开时一闪而过解决办法
  15. C++入门程序作业3
  16. OpenCV-Python 中文教程(搬运)目录
  17. [原]Veracrypt使用Yubikey作为安全令牌
  18. git各种撤销提交
  19. DHCP机制
  20. 跟哥走,带你玩转Surface 2

热门文章

  1. ZOJ 3874 Permutation Graph 分治NTT
  2. Mac OS用minikube安装单节点kubernetes
  3. kbmMW 5.0.1发布了(跨全平台,包括Linux,可使用Win的高性能HTTPSys传输层,等等)
  4. 牛客练习赛42 E.热爆了
  5. HDU1693 Eat the Trees —— 插头DP
  6. LoadRunner检查点使用小结
  7. MYSQL进阶学习笔记五:MySQL函数的创建!(视频序号:进阶_13)
  8. HDU - 1269 迷宫城堡(有向图的强连通分量)
  9. 书写优雅的shell脚本(三) - shell中exec解析
  10. I.MX6 MAC地址修改