HDU 3072 Intelligence System (tarjan-scc缩点 + 最小树形图)
来源:互联网 发布:mac foobar2000 编辑:程序博客网 时间:2024/06/05 12:05
题意:
给了一个含有N<=50000个节点的有向图,图中的两点间通信付出代为经过的边权之和,但是如果这两个点之间相互可达,代价为0
问从给定的节点向其他所有的点通信,所花费的最小代价是多少?
分析:
相互可达的就是一个强联通分量,先缩点成为DAG,最小代价就是最小树形图,因为scc内部都是0,DAG无圈根据最小树形图算法思想,直接把新图最小入边权全部加起来就是ans了
代码:
//// Created by TaoSama on 2015-11-03// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 5e4 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;const int M = 1e5 + 10;int n, m;struct Edge { int v, nxt, c;} edges[M];int head[N], cnt;void add_edge(int u, int v, int c) { edges[cnt] = (Edge) {v, head[u], c}; head[u] = cnt++;}int in[N], id[N], dfn[N], low[N], stk[N], dfsNum, top, scc;void tarjan(int u) { dfn[u] = low[u] = ++dfsNum; in[u] = true; stk[++top] = u; for(int i = head[u]; ~i; i = edges[i].nxt) { int v = edges[i].v; if(!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(in[v]) low[u] = min(low[u], dfn[v]); } if(low[u] == dfn[u]) { ++scc; while(true) { int v = stk[top--]; id[v] = scc; in[v] = false; if(v == u) break; } }}void init() { scc = cnt = top = dfsNum = 0; memset(head, -1, sizeof head); memset(dfn, 0, sizeof dfn); memset(low, 0, sizeof low); memset(in, 0, sizeof in);}int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); while(scanf("%d%d", &n, &m) == 2) { init(); for(int i = 1; i <= m; ++i) { int u, v, c; scanf("%d%d%d", &u, &v, &c); add_edge(u, v, c); } for(int i = 0; i < n; ++i) if(!dfn[i]) tarjan(i); memset(in, 0x3f, sizeof in); for(int i = 0; i < n; ++i) { int u = id[i]; for(int j = head[i]; ~j; j = edges[j].nxt) { int v = id[edges[j].v]; if(u != v) in[v] = min(in[v], edges[j].c); } } int ans = 0; //no "in" edge of root, in[root] = INF; for(int i = 1; i <= scc; ++i) if(in[i] != INF) ans += in[i]; printf("%d\n", ans); } return 0;}
0 0
- HDU 3072 Intelligence System (tarjan-scc缩点 + 最小树形图)
- HDU 3072 Intelligence System(最小树形图+Tarjan)
- hdu3072 Intelligence System(tarjan缩点+最小树形图)
- [tarjan+最小树形图] hdu 3072 Intelligence System
- HDU 3072 Intelligence System(Tarjan+最小树形图)
- HDU 3072 Intelligence System(tarjan+DAG上的最小生成树形图)
- HDU 3072 Intelligence System (强连通缩点+简单最小树形图,4级)
- HDU 3072 Intelligence System(强连通+最小树形图)
- hdu3072 Intelligence System(Tarjan缩点+最小生成树)
- hdu 3072 Intelligence System (Tarjan+Kosaraju+缩点)
- HDU 3072 Intelligence System 强连通 最小树形图
- HDU 3072--Intelligence System【SCC缩点新构图 && 求连通所有SCC的最小费用】
- hdoj--3072--Intelligence System(scc+缩点+数据去重)
- HDU 3072:Intelligence System(强连通+不定根最小树形图)
- hdoj 3072 Intelligence System 【SCC缩点 求连通所有SCC的费用】
- HDU 3072Intelligence System 强连通分量分解 + 最小树形图
- HDU3072 Intelligence System【最小树形图】
- hdu 3072 Intelligence System (强连通,缩点)
- [转]CStatic控件的基本使用
- java架构师之路:JAVA程序员必看的15本书的电子版下载地址
- Kafka单机安装
- 数据保存(三):数据库
- caffe layer `EltwiseLayer`
- HDU 3072 Intelligence System (tarjan-scc缩点 + 最小树形图)
- 51nod 1278 相离的圆 (排序)
- Could not run curl-config: [Errno 2] No such file or directory
- 循环节及周期
- Bubble_Sort & Select_Sort
- JAVA多线程之常用方法
- 《创业维艰》笔记 1
- Lua 类的继承与函数override
- nginx在ubuntu下的安装