题意:

  给出一个N个节点的有向图。图中任意两点进行通信的代价为路径上的边权和。如果两个点能互相到达那么代价为0。问从点0开始向其余所有点通信的最小代价和。保证能向所有点通信。

题解:

  求出所有的强连通分量,然后进行缩点操作。最后贪心的找出每个点的最小代价,然后求和。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 5e4+;
const int inf = 0x3f3f3f3f;
int n, m;
struct node {
int u, v, w;
}e[maxn<<];
vector<int> g[maxn];
vector<int> rg[maxn];
vector<int> vs;
bool vis[maxn];
int cmp[maxn], in[maxn];
ll ans;
void add_edge(int u, int v) {
g[u].push_back(v);
rg[v].push_back(u);
}
void dfs(int u) {
vis[u] = true;
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i];
if(!vis[v]) dfs(v);
}
vs.push_back(u);
}
void rdfs(int u, int k) {
vis[u] = true;
cmp[u] = k;
int len = rg[u].size();
for(int i = ; i < len; i++) {
int v = rg[u][i];
if(!vis[v]) rdfs(v, k);
}
}
int scc() {
memset(vis, , sizeof(vis));
vs.clear();
for(int u = ; u < n; u++) {
if(!vis[u]) dfs(u);
}
memset(vis, , sizeof(vis));
int k = ;
int len = vs.size();
for(int i = len-; i >= ; i--) {
int v = vs[i];
if(!vis[v]) rdfs(v, k++);
}
return k;
}
int main() {
while(~scanf("%d%d", &n, &m)) {
ans = ;
for(int i = ; i < n; i++) {
g[i].clear();
rg[i].clear();
}
for(int i = ; i <= m; i++) {
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
add_edge(e[i].u, e[i].v);
}
n = scc();
for(int i = ; i < n; i++) in[i] = maxn;
for(int i = ; i <= m; i++) {
int u = cmp[e[i].u];
int v = cmp[e[i].v];
if(u!=v) in[v] = min(in[v], e[i].w);
}
for(int i = ; i < n; i++) ans += in[i];
printf("%lld\n", ans);
}
}

最新文章

  1. 三个不常用的HTML元素:&lt;details&gt;、&lt;summary&gt;、&lt;dialog&gt;
  2. AppScan 测试需要输入用户名密码的网站
  3. android蓝牙打印机
  4. SQL Server-游标使用
  5. Linux下smokeping网络监控环境部署记录
  6. 转:Java实现几种常见排序方法
  7. panguan(判官):一个自研的任务执行引擎的工程实践
  8. CacheView。
  9. Csharp日常笔记
  10. class如何命名更规范
  11. UIImage创建图片的两种方式的区别
  12. 笑谈ArcToolbox (2) 开启ArcToolbox的钥匙
  13. jsp页面中从forEach里向action里面传递其中的一个对象
  14. 利用Excel做一些简单的数据分析
  15. P4512 【模板】多项式除法
  16. centos7如何查看网络状态?
  17. 几种不同格式的json解析
  18. mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法
  19. C#生成二维码,裁切边框
  20. 自己使用过比较好用的VSCode插件

热门文章

  1. docker swarm使用keepalived+haproxy搭建基于percona-xtradb-cluster方案的高可用mysql集群
  2. tcp服务端socket
  3. js函数的默认参数
  4. asciinema使用
  5. ethereum(以太坊)(六)--整型(int)
  6. js延迟加载的方式有哪些?
  7. Linux中的代码编辑器vim
  8. fastadmin 后台管理框架使用技巧(持续更新中)
  9. C细节错误
  10. B1081 检查密码 (15分)