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 ...
随机推荐
- Git之路--2
- eclipse 手动安装皮肤
关于自动使用eclipse 主题不成功的给出现在手动的安装方法和jar包 http://pan.baidu.com/s/1kVNEiYr http://pan.baidu.com/s/1cyTZrS ...
- 替换SQL Server数据库中所有表的所有字段的某些内容
declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select a.name,b.name from ...
- 20160406javaweb 之JDBC简单案例
前几天写的user注册登录注销案例,没有用到数据库,现在做出改动,使用数据库存储信息: 一.首先我们需要建立一个数据库: 如下图: 创建数据库的代码如下: -- 导出 database02 的数据库结 ...
- Android数据存储技术
Android提供了4种数据存储技术,分别是SharedPreferences.Files.SQLite数据库和网络存储数据.(有的开发者认为使用ContentProvider也可以算是一种,但我觉得 ...
- SQLServer 在Visual Studio的连接方法
一.Sql Server 在Visual Studio的连接有两种方法: (1)本地计算机连接; [c#] view plaincopy string s = "Data Sourc ...
- 冒泡排序算法(C#实现)
简单的冒泡排序算法,代码如下: ] = temp; hasExchangeAction =true; //发生过互换 } } if (!hasExchangeAction) //如果没有发生过互换,则 ...
- 学习笔记_Java_day12_Cookie
Cookie 1 Cookie概述 1.1 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie就是一个键和一个值构成的 ...
- CocoaPods安装过程中的大坑
一.CocoaPods是什么? CocoaPods是一个用Ruby写的.负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中的.统一管理第三方开源库,为我们节省设置和更新第三方开源库 ...
- 10.29_Extjs-lovcombo
(1) Ext.ux.form.LovCombo多选下拉框 :http://www.iteye.com/topic/340900 (2)combox:icon,lovcombo:icon (3) (4 ...