poj1236(强连通分量)
题意:
(1).至少需要向多少个学校发放软件,要使这个网络中的所有学校都能得到软件
(2).至少需要添加多少条边,才能使这个网络成为一个强连通分量图。
思路:首先求解强连通分量,如果不是同一个强连通分量,则将入度indegree[blong[v]]++
,outdegree[blong[i]]++
。在这些强连通分量中如果入度为零,则需要发放ans1个软件,问题的求解。问题2的求解是求这个max(ans1,ans2).
强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图。
强连通分量:在非强连通图的有向图中,选取部分点为强连通图,该强连通子图称为强连通分量。
求出强连通分量可以进行缩点操作。
一个强连通图的出度和入度是相同的:首先我们先用tarjan缩点,把一些强连通集合变成一个新的点,然后找出新的点的出度和入度,输出最大就行了。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxx=20005;
const int inf=0x3f3f3f3f;
int low[maxx];
int dfn[maxx];
int vis[maxx];
int flag[maxx];
int blong[maxx];//记录这个节点属于哪个强连通分量
int indegree[maxx];//记录入度
int outdegree[maxx];//记录出度
int index;
int tcost[maxx];
int root;
int ans;//记录强连通分量的个数
int n,m;
stack<int>s;
vector<int>G[maxx];
void dfs(int u){index++;low[u]=dfn[u]=index;s.push(u);vis[u]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(dfn[v]==0){dfs(v);low[u]=min(low[u],low[v]);}else if(vis[v]==1){low[u]=min(low[u],dfn[v]);}}if(dfn[u]==low[u]){ans++;int v;do{v=s.top();s.pop();blong[v]=ans;vis[v]=0;}while(u!=v);}
}
void init(){ans=0;memset(flag,0,sizeof(flag));memset(vis,0,sizeof(vis));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(blong,0,sizeof(blong));memset(indegree,0,sizeof(indegree));memset(outdegree,0,sizeof(outdegree));while(!s.empty())s.pop();for(int i=0;i<=n;i++){G[i].clear();}
}
int main(){while(scanf("%d",&n)!=EOF){init();for(int i=1;i<=n;i++){int t;while(scanf("%d",&t)){if(t==0){break;}G[i].push_back(t);}}ans=0;index=1;for(int i=1;i<=n;i++){if(dfn[i]==0){dfs(i);}}for(int i=1;i<=n;i++){for(int j=0;j<G[i].size();j++){int v=G[i][j];if(blong[i]!=blong[v]){outdegree[blong[i]]++;indegree[blong[v]]++;}}}int ans1=0,ans2=0;if(ans==1){cout<<1<<endl;cout<<0<<endl;}else {for(int i=1;i<=ans;i++){if(indegree[i]==0){ans1++;}if(outdegree[i]==0){ans2++;}}cout<<ans1<<endl;int tx=max(ans1,ans2);cout<<tx<<endl;} }return 0;
}
poj1236(强连通分量)相关推荐
- 【C++】强连通分量
强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...
- 极小连通子图和极大连通子图_强连通分量与拓扑排序
前言 由于GacUI里面开始多处用上拓扑排序,我决定把之前瞎JB搞出来的算法换掉,换成个正式的.之前我自己弄了个写起来很简单的算法,然后每一处需要用到的地方我就重新做一遍.当然这样肯定也是不行的,我觉 ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...
- HDU4635(强连通分量+Kosaraju算法)
题意:给出一个有向图,最多添加多少条边使这个图依然不是强连通图:当这个图是强连通图时,输出-1: 求解思路:强连通分量求解: 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. ...
- poj3352(强连通分量)
题意:添加多少边才能使这个无向图为双连通分量. 注意:双连通分量适用于无向图:而强连通分量适用于有向图.但是这两个概念都是一样的. #include<iostream> #include& ...
- poj2553(强连通分量)
题意:给出有向图,图的底部是所有汇节点的子集,即,底部(G)={v∈V\x-∀w∈V:(v→w)⇒(w→v)},w在--里面G可以从v, v也可从w.让我们求有多少个点是绘点的问题. 思路:先求解出强 ...
- poj2186(强连通分量)
思路:找出出度为0 的顶点,如果出度为0的顶点大于1,则解为零,否则解就是出度为零的顶点的连通分支数. 刚开始是没有理解这道题的,也是看了大神之后才理解的. 方法一: #include<iost ...
- HDU5934(强连通分量)
题意:主要在诈弹爆炸的范围内如果存在其他的诈弹,那么在周围的诈弹也将会被引爆,这样思路就可以想到强连通分量了: 思路:先求解强连通分量,在找到强连通分量时,也求解出这个强连通分量的最小费用mincos ...
- HDU2767(强连通分量+Kosaraju算法)
题意:需要加多少边才能把一个图变成强连通分量 强连通图:在有向图中,任意节点除法都可以到达其余所有节点,则称为强连通图. 强连通分量:在非强连通图的有向图中,选取部分点为强连通图,该强连通子图称为强连 ...
最新文章
- 夺命雷公狗---微信开发57----微网站之jquery_mobile之入门案例
- 我们来谈下高并发和分布式中的幂等处理
- wxWidgets:wxVariant类用法
- STL:使用string、vector、complex和limits
- python sort 多级排序_为什么在python中使用排序功能进行多级排序...
- 微信小程序|开发实战篇之七-steps进度条组件
- html中的数字选框,带有复选框和数字类型的HTML表单提交与PHP?
- 电脑排行榜笔记本_热门笔记本电脑排行榜推荐_windows7教程
- POJ1426-Find The Multiple-深度优先搜索BFS
- laravel数组转换为字符串_LeetCode刷题实战108:将有序数组转换为二叉搜索树
- HDU 12O3 I NEED A OFFER!
- hd620显卡linux驱动,Thinkpad T480 Win7 安装 INTEL HD620显卡驱动
- 提高免疫力吃什么 多吃奶制品
- php微信客服接口,微信公众平台开发:多客服接口说明
- 如何将720P的mp4视频转换成1080P的视频?视频分辨率如何修改?
- 体育科技文献通报杂志体育科技文献通报杂志社体育科技文献通报编辑部2022年第6期目录
- 【PM杂谈】我理解的项目管理
- MacOS-Mac开发和iOS开发的区别
- 设置老版版谷歌浏览器自动启用flash
- iOS 15个人热点无法连接?10个修复技巧分享