poj-1236 Network Of Schools【强连通缩点】

来源:互联网 发布:淘宝漏洞券 编辑:程序博客网 时间:2024/05/21 12:49
/*问题A:选择几个点作为起点发送软件,能最少选择几个起点保证所有学校都能收到问题B:添几条边能使任意一个点作为起点发送软件,让所有学校都能收到解决思路:有向图中强连通分量中任意两点两两可达,所以B就是要把图添最少的边构成一个大的强连通分量。假如把图中所有强连通分量缩点,就可以得到一个有向无环图(DAG图)。DAG图中的0入度点的数量就是A的答案。假如DAG图0入度点向0出度点添边,就能构成一个大环,所以B的答案就是 0入度点和0出度点的最大值*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <vector>#define MAX_SIZE 110using namespace std;vector<int> g[MAX_SIZE];//正向图vector<int> rg[MAX_SIZE];//反向图vector<int> rs;//标号表int n;int used[MAX_SIZE];int cmp[MAX_SIZE];int indeg[MAX_SIZE];int outdeg[MAX_SIZE];int find_max(int x,int y){return x>y?x:y;}void add_edge(int u,int v){g[u].push_back(v);rg[v].push_back(u);}void dfs(int u){used[u]=1;for(int i=0;i<g[u].size();++i){int to=g[u][i];if(!used[to])dfs(to);}rs.push_back(u);}void rdfs(int u,int k){used[u]=1;cmp[u]=k;for(int i=0;i<rg[u].size();++i){int to=rg[u][i];if(!used[to])rdfs(to,k);}}void init(){for(int i=0;i<MAX_SIZE;i++){g[i].clear();rg[i].clear();}}void solve(){//正向搜索一次memset(used,0,sizeof(used));rs.clear();for(int i=1;i<=n;++i)if(!used[i])dfs(i);int k=0;//反向搜索一次memset(used,0,sizeof(used));for(int j=rs.size()-1;j>=0;--j){//printf("%d\n",rs[j]);if(!used[rs[j]])rdfs(rs[j],++k);}memset(indeg,0,sizeof(indeg));memset(outdeg,0,sizeof(outdeg));//记录缩点后的图的每个点的出度和入读for(int u=1;u<=n;++u){for(int v=0;v<g[u].size();++v){int to=g[u][v];if(cmp[to]!=cmp[u]){++indeg[cmp[to]];++outdeg[cmp[u]];}}}//得到0出度的点数,和0入度的点数int s_count=0,t_count=0;for(int t=1;t<=k;++t){//printf("i:%d iu:%d out:%d\n",t,indeg[t],outdeg[t]);if(!outdeg[t])++t_count;if(!indeg[t])++s_count;}if(k==1){printf("1\n0\n");return;}//printf("%d %d\n",s_count,t_count);printf("%d\n",s_count);printf("%d\n",find_max(s_count,t_count));}int main(){while(~scanf("%d",&n)){init();for(int i=1;i<=n;i++){int to;while(1){scanf("%d",&to);if(to==0)break;add_edge(i,to);}}solve();}return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华娱,我的老婆我自己捧 全民投资:开局我选悟空 求你们了,让朕当个昏君吧 凌队的千面保镖超A的 我不只是动作巨星 穿越三国:这个阿斗不用扶 绑定百亿物资系统后暴富古代了 遮天之凡体至尊 穿越诸天神话 重生79之我在美国开银行 首次穿越撞上氢弹是否搞错了什么 港综世界的警察 满朝奸臣,你让朕怎么当千古一帝 我的火种战舰 我在魔王城伪装怪物 女配在年代文里做万人迷 九品仙路 护林日常:开局拯救大熊猫 穿越兽世:种田驭夫乐悠悠 不灭战神 我在宝可梦世界开餐厅 爸爸,我是来当你同学的 这个主角明明很强却异常谨慎 四合院:我的穿越为啥这么陋 甩了线上男友后我被亲哭了 人在南天坐看万古 为了成为英灵我只好在历史里搞事 我成了游戏里的反派之王 离婚后,前夫每天都想上位 霍格沃茨的风与鹰翼 攻略暴君后,我抱错大腿了 我的精灵模拟器 金鸾喜嫁 人在美漫,开局枪斗术 大国科技从手机开始 人住超神,渣在诸天 斗罗之王者吕布降临 从白蛇开始诸天改命 诸天之天外降临者 屠龙之前就读过龙族的路明非 足球盛宴,从收购欧洲俱乐部开始