hdu 3072
强连通分量——tarjin 算法
这道题和前面那道hdu 2767唯一不同就是,2767需要找出最小数量的边使图成为连通分量,而这个题需要一点点贪心的思想在里面,它需要求出代价最小的边使图成为连通分量;
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#define N 50006
using namespace std; struct Edge
{
int u, val, next;
Edge() {}
Edge(int a, int b, int c)
{
u=a, val=b, next=c;
}
} edge[]; int head[N],tot,n,m,dfn[N],low[N],T,ind,id[N],in[N];
bool vs[N];
stack<int> S; void add_edge(int st, int en, int val)
{
edge[tot]=Edge(en,val,head[st]);
head[st]=tot++;
} void tarjan(int u)
{
S.push(u), vs[u]=true;
dfn[u]=low[u]=T++;
for(int e=head[u]; e!=-; e=edge[e].next)
{
int v=edge[e].u;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u], low[v]);
}
else if(vs[v] && low[u]>dfn[v]) low[u]=dfn[v];
}
if(low[u]==dfn[u])
{
ind++;
int v;
do
{
v=S.top();
S.pop();
id[v]=ind;
vs[v]=false;
}while(v!=u);
}
} int main()
{
while(scanf("%d%d", &n, &m)!=EOF)
{
memset(head, -, sizeof head);
tot=;
for(int i=, a, b, c; i<m; i++)
{
scanf("%d%d%d", &a, &b, &c);
add_edge(a,b,c);
}
while(!S.empty()) S.pop();
memset(vs, , sizeof vs);
memset(dfn,, sizeof dfn);
memset(low,,sizeof low);
T=ind=;
for(int i=; i<n; i++) if(!dfn[i]) tarjan(i);
for(int i=; i<ind; i++) in[i]=;
for(int i=; i<n; i++)
{
int u=id[i];
for(int e=head[i]; e!=-; e=edge[e].next)
{
int v=id[edge[e].u];
if(u!=v) in[v]=min(in[v], edge[e].val);
}
}
int ans=;
for(int i=; i<ind; i++)
{
if(i==id[]||in[i]==) continue;
ans+=in[i];
}
printf("%d\n", ans);
}
return ;
}
hdu 3072的更多相关文章
- HDU 3072 (强连通分量)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3072 题目大意:为一个有向连通图加边.使得整个图全连通,有重边出现. 解题思路: 先用Tarjan把 ...
- HDU 3072 Intelligence System (强连通分量)
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 3072 Intelligence System(tarjan染色缩点+贪心+最小树形图)
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 3072 Intelligence System(Tarjan 求连通块间最小值)
Intelligence System Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- Intelligence System (hdu 3072 强联通缩点+贪心)
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU - 3072 Intelligence System
题意: 给出一个N个节点的有向图.图中任意两点进行通信的代价为路径上的边权和.如果两个点能互相到达那么代价为0.问从点0开始向其余所有点通信的最小代价和.保证能向所有点通信. 题解: 求出所有的强连通 ...
- hdu 3072 有向图缩点成最小树形图计算最小权
题意,从0点出发,遍历所有点,遍历边时候要付出代价,在一个SCC中的边不要付费.求最小费用. 有向图缩点(无需建立新图,,n<=50000,建则超时),遍历边,若不在一个SCC中,用一个数组更新 ...
- HDU 3072 SCC Intelligence System
给出一个带权有向图,要使整个图连通.SCC中的点之间花费为0,所以就先缩点,然后缩点后两点之间的权值为最小边的权值,把这些权值累加起来就是答案. #include <iostream> # ...
- HDU——3072 Intelligence System
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- 从数组中随机取n条不重复的数据
工作中经常遇到有关数组的一些操作 1. 从数据中随机取n条不重复的数据 (PS:下面的S.each是KISSY.each方法,大家可以改为for循环) /* 1 从数组arr中随机取n条不重复的数据 ...
- StringBuffer与StringBuilder之间的区别
public class Test { public static void main(String[] args) { StringBuffer strBuffer = new StringBuff ...
- freewrap——将tcl/tk脚本转变为可执行文件
FreeWrap可以把TCL/TK的脚本和二进制文件打包成应用程序,FreeWrap将所有的文件组合成一个单独的可执行文件. FreeWrap的原理是把脚本和tcl/tk解释器和库文件都打包 ...
- 技术QQ群
欢迎加入moss技术交流群. 欢迎加入微信技术交流群.
- sea.js 学习
开篇:终于学习了sea.js的使用了,因为它是一个模块加载工具,所以首先要了解javascript的模块编程,然后对sea.js的了解和使用 javascript 模块编程 为什么要模块化编程,为了让 ...
- ASP.NET MVC5总结(三)登陆中常用技术解析之session与cookie
1.session机制 session机制是在服务器端保持状态的方案,在做系统登陆时,我们往往会用到session来存储一些用户登录的重要信息,而这些信息是不能存在cookie中的. 当访问量增多时, ...
- c#泛型方法重载
这里存在普通的方法Foo和泛型方法Foo,如果直接调用: 则会自动优先匹配对应的非泛型方法.输出如下: 但需要注意的是,这一匹配过程是在编译过程进行的,所以如果是通过其它泛型间接调用.则只会调用对应的 ...
- Quartz2.2.1操作手册
一.初识quartz JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1") ...
- Linux Install Node.js
1.下载node.js安装包,请参考网址:http://nodejs.org/download/ 在这个网址里面提供了几种node.js安装的方式 https://github.com/joyent/ ...
- 【CODECHEF】【phollard rho + miller_rabin】The First Cube
All submissions for this problem are available. Read problems statements in Mandarin Chinese and Rus ...