博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-3072-IntelligenceSystem(tarjan,贪心)
阅读量:7116 次
发布时间:2019-06-28

本文共 2118 字,大约阅读时间需要 7 分钟。

链接:

题意:

给你n个点,1个点到另一个点连接花费c,但是如果几个点可以相互可达,则这几个点连通花费为0.

求将整个图连通的最小花费。

思路:

tarjan,求出强连通子图。

对每个子图的进点的最小值更新,再累加即可,(不过不知道为什么)

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int MAXN = 5e4+10;const int INF = 0x3f3f3f3f;struct Node{ int from_, to_, value_; Node(int from, int to, int value):from_(from), to_(to), value_(value){} bool operator < (const Node &that) const { return this->value_ > that.value_; }};vector
G[MAXN];stack
St;int Dfn[MAXN], Low[MAXN];int Vis[MAXN], Dis[MAXN];int Fa[MAXN], Val[MAXN];int Num[MAXN];int n, m;int times, cnt;void Init(){ for (int i = 1;i <= n;i++) G[i].clear(), Fa[i] = i; memset(Dfn, 0, sizeof(Dfn)); memset(Low, 0, sizeof(Low)); memset(Vis, 0, sizeof(Vis)); memset(Dis, 0, sizeof(Dis)); memset(Num, 0, sizeof(Num)); memset(Val, 0, sizeof(Val)); times = cnt = 0;}void Tarjan(int x){ Dfn[x] = Low[x] = ++times; Vis[x] = 1; St.push(x); for (int i = 0;i < G[x].size();i++) { int node = G[x][i].to_; if (Dfn[node] == 0) { Tarjan(node); Low[x] = min(Low[x], Low[node]); } else if (Vis[node] == 1) Low[x] = min(Low[x], Dfn[node]); } if (Low[x] == Dfn[x]) { cnt++; Num[cnt] = 0; while (St.top() != x) { Num[cnt]++; Fa[St.top()] = cnt; Vis[St.top()] = 0; St.pop(); } Num[cnt]++; Fa[St.top()] = cnt; Vis[St.top()] = 0; St.pop(); }}int main(){ int t, cn = 0; while (~scanf("%d%d", &n, &m)) { Init(); int l, r, v; for (int i = 1;i <= m;i++) { scanf("%d%d%d", &l, &r, &v); l++, r++; G[l].emplace_back(l, r, v); } for (int i = 1;i <= n;++i) if (!Dfn[i]) Tarjan(i); for (int i = 1;i <= cnt;i++) Val[i] = INF; for (int i = 1;i <= n;i++) { for (int j = 0;j < G[i].size();j++) { int node = G[i][j].to_; if (Fa[i] != Fa[node]) Val[Fa[node]] = min(Val[Fa[node]], G[i][j].value_); } } int res = 0; for (int i = 1;i <= cnt;i++) if (Val[i] != INF) res += Val[i]; cout << res << endl; } return 0;}

  

转载于:https://www.cnblogs.com/YDDDD/p/10822851.html

你可能感兴趣的文章
iOS应用内语言切换功能
查看>>
如何写好一个UITableView
查看>>
上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?...
查看>>
NET Core-TagHelper实现分页标签
查看>>
Cesium原理篇:6 Renderer模块(1: Buffer)
查看>>
defered,promise回顾
查看>>
svn提交时出现很多乱文件怎么解决
查看>>
std::unique_lock<std::mutex> or std::lock_guard<std::mutex> C++11 区别
查看>>
SQL - ROW_NUMBER,Rank 添加序号列
查看>>
常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
查看>>
python3.x 和 python2.x关于 urllib的用法
查看>>
在pycharm中进行nosetests并输出测试报告
查看>>
树莓派:设置与软件安装
查看>>
JQuery日记_5.14 Sizzle选择器(七)
查看>>
debian8上安装pyspider - pyspider中文文档 - pyspider中文网
查看>>
【WaaCaa】一款开源科学作图/数据可视化工具 —— 诞生篇
查看>>
idea,eclipse创建多模块项目
查看>>
Tomcat中常见线程说明
查看>>
【iCore1S 双核心板_FPGA】例程八:触发器实验——触发器的使用
查看>>
Spring jdbcTemplate
查看>>