博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1236 强联通分量
阅读量:4972 次
发布时间:2019-06-12

本文共 1201 字,大约阅读时间需要 4 分钟。

大致题意给你有一个点数为n<=100的有向图。

求解两个子任务:

1:最少给多少个点信息,这些点的信息可以顺着有向边传遍全图。

2:最少要加多少条边,使得整个图强联通。

求强联通分量再缩点后得到一个有向无环图。

设其入度为0的点数为t1,出度为0的点数为t2

1的答案即为强联通缩点之后入度为0的点的数量t1。

2的答案即为max(t1,t2).

注意一个特殊情况:若缩点后只有一个点了(即原图便是强联通的)此时t1=1,t2=1但是第二个任务的答案应当是0。

AC代码:

#include
#include
#include
#include
#define rep(i,a,b) for(int i=a;i<=b;++i)using namespace std;const int MAXN=110;int n,cnt;int graph[MAXN][MAXN];int DFN[MAXN],low[MAXN],Stap[MAXN],label[MAXN];bool instake[MAXN];int Stop,Bcnt;int adjm[MAXN][MAXN];int in[MAXN],out[MAXN];void init(){ memset(graph,0,sizeof(graph)); memset(DFN,0,sizeof(DFN)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); memset(adjm,0,sizeof(adjm)); memset(instake,0,sizeof(instake)); int t; cnt=0;Stop=0;Bcnt=0; rep(i,1,n) { while(scanf("%d",&t)==1&&t) { graph[i][++graph[i][0]]=t; } }}void tarjan(int u){ DFN[u]=low[u]=++cnt; instake[u]=1; Stap[++Stop]=u; rep(i,1,graph[u][0]) { int v=graph[u][i]; if(!DFN[v]) { tarjan(v); if(low[v]

 

转载于:https://www.cnblogs.com/zhixingr/p/7822422.html

你可能感兴趣的文章
Fireworks基本使用
查看>>
Linux 标准 I/O 库
查看>>
.net Tuple特性
查看>>
Java基础常见英语词汇
查看>>
nginx启动、关闭命令、重启nginx报错open() "/var/run/nginx/nginx.pid" failed
查看>>
BZOJ 3097 Hash Killer I
查看>>
UINavigationController的视图层理关系
查看>>
html阴影效果怎么做,css 内阴影怎么做
查看>>
宏观经济
查看>>
综合练习:词频统计
查看>>
BZOJ1026: [SCOI2009]windy数
查看>>
样板操作数
查看>>
64位UBUNTU下安装adobe reader后无法启动
查看>>
组件:slot插槽
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
利用sed把一行的文本文件改成每句一行
查看>>
Android应用开发:核心技术解析与最佳实践pdf
查看>>
python——爬虫
查看>>