图论-有向图的连通性模板题(hdu1296)(hdu1827)
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)相关推荐
- ~~朴素dijkstra算法 (搜索与图论)(附模板题AcWing 849. Dijkstra求最短路 I)
模板 时间复杂是 O(n2+m), n表示点数,m 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存 ...
- POJ3164 最小树形图 有向图的最小生成树 模板题 朱刘算法 朱永津-刘振宏算法
Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 12833 Accepted: 3717 ...
- 一起开心2020暑假训练第二周 图论(模板题)
比赛链接: 文章目录 A HDU 1285 一 B HDU 1863 起 C POJ 2387 开 D POJ 1502 心 E HDU 5922 图 F HDU 2112 论 A HDU 1285 ...
- 模板 - 有向图的连通性
整理的算法模板合集: ACM模板 目录 tarjan模板 最大半连通子图 tarjan缩点+记忆化搜索 几个结论 tarjan缩点以后的点(强连通分量) 要么出度和入度都为0 要么有出度,入度为0 要 ...
- 离散数学 --- 图论基础 --- 无向图的连通性和有向图的连通性
第一部分 ---- 无向图的连通性 1.完全图:任意两个结点之间都有边 2.零图:所有结点都是孤立结点 3.平凡图:仅有一个结点的图 1.等价类:R是集合上的一个等价关系,选定集合中的任意一个元素a, ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- [USACO07FEB]银牛派对Silver Cow Party---最短路模板题
银牛排队 对于我这种蒟蒻来说,还是不要跑一次单元最短路.跑两次好写呀(- ̄▽ ̄)- 而题目中是有向图.如果如果按照题意进行最短路的话.就会出现一个单终点最短路和一个单起点最短路 对于单起点自然就是套模 ...
- kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题)
kuangbin 最小生成树专题 - ZOJ - 1586 QS Network (朴素 Prim算法 模板题) 总题单 week 3 [kuangbin带你飞] 题单 最小生成树 + 线段树 Cli ...
- POj 3164 Command Network最小树形图 模板题 朱刘算法
Command Network After a long lasting war on words, a war on arms finally breaks out between littleke ...
最新文章
- 贪心 ---- Educational Codeforces Round 90 (Rated for Div. 2)E. Sum of Digits[数位贡献+思维题+贪心]
- 避免35岁现象,我给技术人的建议永远是架构师!
- 怎样解决样本不平衡问题
- 成功解决UserWarning: Update your `Conv2D` call to the Keras 2 API问题
- 【渗透测试】一次从黑盒转向白盒
- Tomcat的热部署和重新启动和重新部署的关系
- 调用webservice或wcf时,提示:无法加载协定为的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
- 一年有几个月几个季度_胎教几个月开始 注意事项有哪些?
- 极限编程阅读笔记--第二篇
- HDU - 4552 怪盗基德的挑战书(后缀数组+RMQ/KMP+dp)
- Java的io类的使用场景
- 每日一题题目26:选择排序(冒泡排序改进版)
- Object C中创建线程的方法有NSThread,GCD, NSOperation
- 机器视觉——2019试卷
- 北斗卫星导航系统BDS的星座和信号
- 晶体管电路设计.铃木雅臣
- Science子刊:母亲的身体气味增强了婴儿和成人的脑-脑同步
- 2016年GitHub上史上最全的Android开源项目分类汇总
- 帆软中的日期函数,当月第一天,当年第一天,当月最后一天等
- WARN Error while fetching metadata with correlation id 5 : {testtopic=LEADER_NOT_AVAILABLE}