Intelligence System HDU - 3072(强连通分量)

Intelligence System

HDU - 3072

题意:一个人要传递命令给所有人,如果两人之间互达,不需任何费用,求最少费用

有向图强连通。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf=0x3f3f3f3f;
 4 const int maxv=50010;
 5 const int maxe=100010;
 6 int n,m;
 7 struct Edge{
 8     int u,v,w;
 9     int nex;
10 }e[maxe<<1];
11 int head[maxv];
12 int cnt=0;
13 void init(){
14     memset(head,-1,sizeof(head));
15     cnt=0;
16 }
17 void add(int u,int v,int w){
18     e[cnt].u=u;
19     e[cnt].v=v;
20     e[cnt].w=w;
21     e[cnt].nex=head[u];
22     head[u]=cnt++;
23 }
24 int pre[maxv],sccno[maxv],low[maxv],dfsk,scc_cnt;
25 stack<int> s;
26 void dfs(int u){
27     s.push(u);
28     low[u]=pre[u]=++dfsk;
29     for(int i=head[u];i!=-1;i=e[i].nex){
30         int v=e[i].v;
31         if(!pre[v]){
32             dfs(v);
33             low[u]=min(low[u],low[v]);
34         }
35         else if(!sccno[v]) low[u]=min(low[u],pre[v]);
36     }
37     if(low[u]==pre[u]){
38         scc_cnt++;
39         for(;;){
40             int x=s.top();
41             s.pop();
42             sccno[x]=scc_cnt;
43             if(x==u) break;
44         }
45     }
46 }
47 void find_scc(int n){
48     memset(pre,0,sizeof(pre));
49     memset(sccno,0,sizeof(sccno));
50     memset(low,0,sizeof(low));
51     dfsk=scc_cnt=0;
52     for(int i=0;i<n;i++) if(!pre[i]) dfs(i);
53 }
54 int d[maxv];
55 int main(){
56     while(scanf("%d%d",&n,&m)!=EOF){
57         init();
58         int u,v,w;
59         for(int i=0;i<m;i++){
60             scanf("%d%d%d",&u,&v,&w);
61             add(u,v,w);
62         }
63
64         find_scc(n);
65
66         for(int i=1;i<=scc_cnt;i++) d[i]=inf;
67         for(int i=0;i<n;i++){
68             for(int j=head[i];j!=-1;j=e[j].nex){
69                 int a=sccno[e[j].u];
70                 int b=sccno[e[j].v];
71                 if(a!=b) d[b]=min(d[b],e[j].w);  //不互达,费用取最小的
72             }
73         }
74         int ans=0;
75         for(int i=1;i<=scc_cnt;i++)
76             if(d[i]!=inf) ans+=d[i];
77         printf("%d\n",ans);
78     }
79 }

时间: 2024-10-20 22:34:46

Intelligence System HDU - 3072(强连通分量)的相关文章

Intelligence System (hdu 3072 强联通缩点+贪心)

Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1650    Accepted Submission(s): 722 Problem Description After a day, ALPCs finally complete their ultimate intelligence syste

hdu 4635 强连通分量+缩点

http://acm.hdu.edu.cn/showproblem.php?pid=4635 Problem Description Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the edges you can add that the graph is still a simple directed graph. Also, after you add

HDU 1269 强连通分量tarjan算法

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6655    Accepted Submission(s): 2973 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房

hdu 3594 强连通分量加环

传送门:Cactus 判断给定的有向图是否满足 1.强连通 2 每一条边属于且仅属于一个环?YES:NO 存在有两种情况(yy一下) 1.他的子节点在栈中 2.他的子节点的最早的时间戳不是他 #include <stdio.h> #include <string.h> #include <vector> #include <stack> #include <algorithm> using namespace std; #define N 200

UVa 12167 &amp; HDU 2767 强连通分量 Proving Equivalences

题意:给出一个有向图,问最少添加几条有向边使得原图强连通. 解法:求出SCC后缩点,统计一下出度为0的点和入度为0的点,二者取最大值就是答案. 还有个特殊情况就是本身就是强连通的话,答案就是0. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <stack&

算法笔记_144:有向图强连通分量的Tarjan算法(Java)

目录 1 问题描述 2 解决方案 1 问题描述 引用自百度百科: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量(strongly connected components). Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量. 定义D

HDU 3072 Intelligence System (强连通分量)

题目地址:HDU 3072 这题一开始理解错题目意思了..(不得不吐槽一下题目意思确实不好理解..)用的强连通+最小生成树做的...然后错了好多遍...sad..题目意思是从一个给定点向其他所有点通信的最少花费,那么入度为0的点肯定是那个给定点.然后对于其它点,枚举就好了.找一个到他花费最少的点的花费. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue&g

HDU - 3072 Intelligence System(强连通分量+类最小生成树)

题目大意:有一个人想要将消息告诉给所有人(在同一个强连通分量里面的人可以相互转告,费用为0),问所有人都知道消息的最小花费是多少 解题思路:求出所有的强连通分量,然后将其缩点,桥就是连接其中的边 因为是张连通图,所以只要求出每个强连通分量被通知的最小价值,然后累加即可 刚开始以为可以用最小生成树,但发现错了,假设求出了三个强连通分量了,分别标号为1,2,3 再给出桥 1-2,权值1,1-3权值5,3-2权值4 按最小生成树的话,得到的结果是5,然而并不是这样的,因为是有向边,所以3这个点是不会被

HDU 3072 Intelligence System(强连通+最小树形图)

HDU 3072 Intelligence System 题目链接 题意:给定有向图,边有权值,求保留一些边,从一点出发,能传递到其他所有点的最小代价,保证有解 思路:先缩点,然后从入度为0的点作为起点(因为题目保证有解,所以必然有一个且只有一个入度为0的点),然后做一下最小树形图即可 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #includ