1.强连通分量:
强连通分量可以理解为边数最少的情况下是一个环。
这里写了一个模板题用的是tarjan算法,当然还有其他算法。
tarjan算法的关键其实还是对于num数组和low数组的使用
然后可以用栈来分离不同的ssc
感觉跟双边连通分量有异曲同工之妙

第一题hdu1296

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn  20010
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
int n,m;
vector < vector<int> > maps;
int low[maxn];
int num[maxn];
int stacks[maxn],ssc[maxn];
int dfsnum=0,top,cnt;
void init(){memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(ssc,0,sizeof(ssc));dfsnum=0;top=0;cnt=0;
}
void dfs(int u){stacks[top++]=u;low[u]=num[u]=++dfsnum;for(int i=0;i<maps[u].size();i++){int v=maps[u][i];if(!num[v]){dfs(v);low[u]=min(low[v],low[u]);}else if(!ssc[v])  low[u]=min(low[u],num[v]);  //处理回退边}if(low[u]==num[u]){   //栈底的点是ssc的祖先,low=num值cnt++;while(true){int v=stacks[--top];ssc[v]=cnt;if(u==v)  break;}}
}void tarjan(){init();for(int i=1;i<=n;i++)   //因为最少便的情况下是一个环,所以说从哪个点开始走,都可以回到原始点if(!num[i])  dfs(i);
}int main()
{while(scanf("%d%d",&n,&m)&&n){init();maps.clear();maps.resize(10010);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);maps[x].push_back(y);}tarjan();if(cnt>1)  printf("No\n");else printf("Yes\n");}return 0;
}

第二题hdu1827
这个还是先用tarjan算法来求有多少个强连通分量,然后我们再用缩点的思想把一个强连通量当一个点来看,因为要最少的人,相当于找入度0的人来打电话。

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn  2010
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
int n,m;
vector < vector<int> > maps;
int low[maxn];
int num[maxn];
int stacks[maxn],ssc[maxn];
int dfsnum=0,top,cnt;
int price[maxn];
int cost[maxn];
int degree[maxn];
void init(){memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(ssc,0,sizeof(ssc));memset(degree,0,sizeof(degree));memset(cost,MaxN,sizeof(cost));dfsnum=0;top=0;cnt=0;
}
void dfs(int u){stacks[top++]=u;low[u]=num[u]=++dfsnum;for(int i=0;i<maps[u].size();i++){int v=maps[u][i];if(!num[v]){dfs(v);low[u]=min(low[v],low[u]);}else if(!ssc[v])  low[u]=min(low[u],num[v]);}if(low[u]==num[u]){cnt++;while(true){int v=stacks[--top];ssc[v]=cnt;cost[cnt]=min(cost[cnt],price[v]);if(u==v)  break;}}
}
void tarjan(){for(int i=1;i<=n;i++)if(!num[i]){dfs(i);}for(int i=1;i<=n;i++){for(int f=0;f<maps[i].size();f++){if(ssc[i]!=ssc[maps[i][f]])  degree[ssc[maps[i][f]]]++;}}int ans1=0,ans2=0;//for(int i=1;i<=n;i++)  cout<<degree[i]<<" ";for(int i=1;i<=cnt;i++){if(degree[i]==0)  ans2+=cost[i],ans1++;}printf("%d %d\n",ans1,ans2);
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){init();maps.clear();maps.resize(1010);for(int i=1;i<=n;i++)  scanf("%d",&price[i]);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);maps[x].push_back(y);}tarjan();}return 0;
}

图论-有向图的连通性模板题(hdu1296)(hdu1827)相关推荐

  1. ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)

    模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...

  2. POJ3164 最小树形图 有向图的最小生成树 模板题 朱刘算法 朱永津-刘振宏算法

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 12833   Accepted: 3717 ...

  3. 一起开心2020暑假训练第二周 图论(模板题)

    比赛链接: 文章目录 A HDU 1285 一 B HDU 1863 起 C POJ 2387 开 D POJ 1502 心 E HDU 5922 图 F HDU 2112 论 A HDU 1285 ...

  4. 模板 - 有向图的连通性

    整理的算法模板合集: ACM模板 目录 tarjan模板 最大半连通子图 tarjan缩点+记忆化搜索 几个结论 tarjan缩点以后的点(强连通分量) 要么出度和入度都为0 要么有出度,入度为0 要 ...

  5. 离散数学 --- 图论基础 --- 无向图的连通性和有向图的连通性

    第一部分 ---- 无向图的连通性 1.完全图:任意两个结点之间都有边 2.零图:所有结点都是孤立结点 3.平凡图:仅有一个结点的图 1.等价类:R是集合上的一个等价关系,选定集合中的任意一个元素a, ...

  6. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  7. [USACO07FEB]银牛派对Silver Cow Party---最短路模板题

    银牛排队 对于我这种蒟蒻来说,还是不要跑一次单元最短路.跑两次好写呀(- ̄▽ ̄)- 而题目中是有向图.如果如果按照题意进行最短路的话.就会出现一个单终点最短路和一个单起点最短路 对于单起点自然就是套模 ...

  8. kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题)

    kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题) 总题单 week 3 [kuangbin带你飞] 题单 最小生成树 + 线段树 Cli ...

  9. POj 3164 Command Network最小树形图 模板题 朱刘算法

    Command Network After a long lasting war on words, a war on arms finally breaks out between littleke ...

最新文章

  1. 贪心 ---- Educational Codeforces Round 90 (Rated for Div. 2)E. Sum of Digits[数位贡献+思维题+贪心]
  2. 避免35岁现象,我给技术人的建议永远是架构师!
  3. 怎样解决样本不平衡问题
  4. 成功解决UserWarning: Update your `Conv2D` call to the Keras 2 API问题
  5. 【渗透测试】一次从黑盒转向白盒
  6. Tomcat的热部署和重新启动和重新部署的关系
  7. 调用webservice或wcf时,提示:无法加载协定为的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
  8. 一年有几个月几个季度_胎教几个月开始 注意事项有哪些?
  9. 极限编程阅读笔记--第二篇
  10. HDU - 4552 怪盗基德的挑战书(后缀数组+RMQ/KMP+dp)
  11. Java的io类的使用场景
  12. 每日一题题目26:选择排序(冒泡排序改进版)
  13. Object C中创建线程的方法有NSThread,GCD, NSOperation
  14. 机器视觉——2019试卷
  15. 北斗卫星导航系统BDS的星座和信号
  16. 晶体管电路设计.铃木雅臣
  17. Science子刊:母亲的身体气味增强了婴儿和成人的脑-脑同步
  18. 2016年GitHub上史上最全的Android开源项目分类汇总
  19. 帆软中的日期函数,当月第一天,当年第一天,当月最后一天等
  20. WARN Error while fetching metadata with correlation id 5 : {testtopic=LEADER_NOT_AVAILABLE}

热门文章

  1. 2021.9.6 跑FICS【当时的经验】
  2. 加速 PyTorch 模型训练的 9 个技巧
  3. IDEA 小技巧之书签与收藏
  4. 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
  5. php简单的log文件
  6. Git_学习_06_ 放弃本地修改
  7. Ubuntu中虚拟环境pip安装包超时问题
  8. 一次完整的从webshell到域控的探索之路
  9. H3C Boot升级 Serial模式
  10. EditText中的几个常用属性