强连通 HDU3072
n个点m条边
m条边 权值
简单点说就是求把所有强连通分量连在一起所需的最小花费 不用双向
图是联通的 cost[] 维护到这里的最小花费求和
- #include<stdio.h>
- #include<string.h>
- #include<stack>
- #include<algorithm>
- using namespace std;
- #define inf 100000000
- #define MAXN 50010
- #define MAXN1 1000010
- int head[MAXN];
- struct edg
- {
- int fr,to,w,next;
- }x[MAXN1];
- int cnt,k,num;
- int dfn[MAXN],low[MAXN],z[MAXN],f[MAXN],cost[MAXN];
- bool vis[MAXN];
- void add(int u,int v,int w)
- {
- x[cnt].fr=u;
- x[cnt].next=head[u];
- x[cnt].to=v;
- x[cnt].w=w;
- head[u]=cnt++;
- }
- stack<int>s;
- void dfs(int u)
- {
- dfn[u]=low[u]=k++;
- vis[u]=;
- s.push(u);
- int i;
- for(i=head[u];i!=-;i=x[i].next)
- {
- if(!dfn[x[i].to])
- {
- dfs(x[i].to);
- low[u]=min(low[u],low[x[i].to]);
- }
- else if(vis[x[i].to])
- low[u]=min(low[u],dfn[x[i].to]);
- }
- if(dfn[u]==low[u])
- {
- num++;
- while(!s.empty())
- {
- int now=s.top();
- s.pop();
- vis[now]=;
- f[now]=num;
- if(now==u)
- break;
- }
- }
- }
- int main()
- {
- int n,m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- int i;
- cnt=;
- num=;
- k=;
- memset(cost,,sizeof(cost));
- memset(head,-,sizeof(head));
- memset(vis,,sizeof(vis));
- memset(dfn,,sizeof(dfn));
- memset(f,,sizeof(f));
- memset(z,,sizeof(z));
- for(i=;i<=m;i++)
- {
- int a,b,w;
- scanf("%d%d%d",&a,&b,&w);
- add(a,b,w);
- }
- for(i=;i<n;i++)
- cost[i]=inf;
- for(i=;i<n;i++)
- if(!dfn[i])
- dfs(i);
- for(i=;i<cnt;i++)
- {
- int u,v;
- u=f[x[i].fr];
- v=f[x[i].to];
- if(u!=v)
- cost[v]=min(cost[v],x[i].w);
- }
- int ans=;
- for(i=;i<=num;i++)
- {
- if(cost[i]!=inf)
- ans=ans+cost[i];
- }
- printf("%d\n",ans);
- }
- return ;
- }
强连通 HDU3072的更多相关文章
- hdu3072 强连通+最小树形图
题意:有一个人他要把一个消息通知到所有人,已知一些通知关系:A 能通知 B,需要花费 v,而又知道,如果某一个小团体,其中的成员相互都能直接或间接通知到,那么他们之间的消息传递是不需要花费的,现在问这 ...
- HDU5934 强连通分量
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 根据距离关系建边 对于强连通分量来说,只需引爆话费最小的炸弹即可引爆整个强连通分量 将所有的强连通分 ...
- POJ1236Network of Schools[强连通分量|缩点]
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16571 Accepted: 65 ...
- 有向图的强连通分量的求解算法Tarjan
Tarjan算法 Tarjan算法是基于dfs算法,每一个强连通分量为搜索树中的一颗子树.搜索时,把当前搜索树中的未处理的结点加入一个栈中,回溯时可以判断栈顶到栈中的结点是不是在同一个强连通分量中.当 ...
- The Bottom of a Graph-POJ2553强连通
The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9759 Accepted: 4053 ...
- Tarjan算法--强连通分量
tarjan的过程就是dfs过程. 图一般能画成树,树的边有三种类型,树枝边 + 横叉边(两点没有父子关系) + 后向边(两点之间有父子关系): 可以看到只有后向边能构成环,即只有第三张图是强连通分量 ...
- bzoj 1051 (强连通) 受欢迎的牛
题目:这里 题意: Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为 ...
- 强连通分量的一二三 | | JZOJ【P1232】 | | 我也不知道我写的什么
贴题: 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之 ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
随机推荐
- CF722D. Generating Sets[贪心 STL]
D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 转:设置Eclipse中的tab键为4个空格的完整方法
from: https://my.oschina.net/xunxun10/blog/110074 设置Eclipse中的tab键为4个空格的完整方法 收藏 XunXun10 发表于 4年前 阅读 ...
- preg_match()漏洞
今天大哥丢了一道题过来. <?php $str = intval($_GET['id']); $reg = preg_match('/\d/is', $_GET['id']); //有0-9的数 ...
- Android http超时选项的测试
Android通过HttpConnectionParams类为http参数设置提供了两个超时的设置选项,分别是setSoTimeout和setConnectionTimeout.初看一眼Android ...
- PagerHelper-分页类
2016.01.29 public static class PagerHelper { #region 数字分页类 /// <summary> /// /// </summar ...
- AngularJs 1.5 $location获取url参数
地址:http://localhost/waservice.html?id=17 获取参数id的值 app.config(['$locationProvider', function ($locati ...
- IOS之推送通知(本地推送和远程推送)
推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...
- JS常用自定义方法
1,JS生成随机数方法 getRandom(100),表示生成0-100的数 function getRandom(n){ return Math.floor(Math.random()*n+1) } ...
- C# socket UDPの异步链接
基于C#的UDP异步连接,在本机上通过测试
- P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...