【poj1236】 Network of Schools
http://poj.org/problem?id=1236 (题目链接)
题意
给定一个有向图,求:1.至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点;2.至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点。
Solution
先用Tarjan缩点,所以原图就变成了一个有向无环图(DAG),问题1很简单,只要找出图中入度为0的点有几个就可以了。而第2问的话,看起来就觉得好麻烦的样子,可是看了题解后发现原来如此简单。。用ans1记录入度为0的点的个数,ans2记录出度为0的点的个数,让当前点形成连通块的条件是什么呢,所有的点的入度和出度都不为0。将出度为0的点连一条边向入度为0的点,如果还有多余,那么随意向其他点连边即可,所以第二问的答案就是max(ans1,ans2)。当缩点后只有一个点的话,那么就直接输出1和0。
代码
- // poj2186
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<cmath>
- #include<set>
- #define MOD 1000000007
- #define inf 2147483640
- #define LL long long
- #define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
- using namespace std;
- inline LL getint() {
- LL x=0,f=1;char ch=getchar();
- while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
- while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
- return x*f;
- }
- const int maxn=2000;
- struct edge {int to,next;}e[maxn<<2],ee[maxn<<2];
- int s[maxn],dfn[maxn],low[maxn],head[maxn],heade[maxn],f[maxn],r[maxn],c[maxn],pos[maxn],b[maxn][maxn];
- int cnt,top,tot,n,ind;
- void insert(int u,int v) {
- e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
- }
- void inserte(int u,int v) {
- ee[++cnt].to=v;ee[cnt].next=heade[u];heade[u]=cnt;
- }
- void Tarjan(int u) {
- dfn[u]=low[u]=++ind;
- s[++top]=u;
- f[u]=1;
- for (int i=head[u];i;i=e[i].next) {
- if (!dfn[e[i].to]) {
- Tarjan(e[i].to);
- low[u]=min(low[u],low[e[i].to]);
- }
- else if (f[e[i].to]) low[u]=min(low[u],dfn[e[i].to]);
- }
- if (low[u]==dfn[u]) {
- tot++;int j;
- do {
- j=s[top--];
- pos[j]=tot;
- f[j]=0;
- }while (j!=u);
- }
- }
- int main() {
- while (scanf("%d",&n)!=EOF) {
- ind=0;cnt=0;top=0;
- for (int i=1;i<=n;i++) pos[i]=heade[i]=head[i]=s[i]=dfn[i]=low[i]=r[i]=c[i]=0;
- for (int i=1;i<=n;i++) {
- int x;
- while (scanf("%d",&x)!=EOF && x!=0) insert(i,x);
- }
- for (int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i);
- cnt=0;
- for (int i=1;i<=n;i++)
- for (int j=head[i];j;j=e[j].next)
- if (!b[pos[i]][pos[e[j].to]] && pos[i]!=pos[e[j].to])
- inserte(pos[i],pos[e[j].to]);
- for (int i=1;i<=tot;i++)
- for (int j=heade[i];j;j=ee[j].next) {
- r[ee[j].to]++;
- c[i]++;
- }
- int ans1=0,ans2=0;
- for (int i=1;i<=tot;i++) if (r[i]==0) ans1++;
- for (int i=1;i<=tot;i++) if (c[i]==0) ans2++;
- printf("%d\n",ans1);
- if (tot==1) printf("0\n");
- else printf("%d\n",max(ans1,ans2));
- }
- return 0;
- }
【poj1236】 Network of Schools的更多相关文章
- 【图论】Network of Schools
[POJ1236]Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18969 Acc ...
- 【tarjan+缩点】POJ1236[IOI1996]-Network of Schools
[题意] 见:http://blog.csdn.net/ascii991/article/details/7466278 [思路] 缩点+tarjan,思路也可以到上面的博客去看.(吐槽:这道题其实我 ...
- 【IOI 1996】 Network of Schools
[题目链接] 点击打开链接 [算法] 对于第一问,将这个图缩点,输出出度为零的点的个数 对于第二问,同样将这个图缩点,输出入度为零.出度为零的点的个数的最大值 [代码] #include <al ...
- POJ1236:Network of Schools (思维+Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24880 Accepted: 99 ...
- 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点
题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...
- 【洛谷P2746】Network of Schools
题目大意:给定一个 N 个点,M 条边的有向图,第一问求至少从多少个点出发才能遍历整个有向图,第二问求至少在这个有向图的基础上加多少条边才能使得该无向图强连通. 题解:先进行 Tarjan 缩点,得到 ...
- 【BZOJ】【1834】【ZJOI2010】Network 网络扩容
网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...
- 【树形贪心】【UVA1267】Network
重要意义:复习好久没写的邻接表了. Network, Seoul 2007, LA3902 Consider a tree network with n nodes where the interna ...
- 【OpenStack】network相关知识学习
network 类型 local:通信不跨主机,必须同一网段,主要做单机测试使用: flat:统计可以跨主机,但是需要在同一网段: 每个 flat network 都会独占一个物理网卡 计算节点上 b ...
随机推荐
- 错误异常 (1)Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly
[已解决]Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) wil ...
- js原生选项卡(包含移动端无缝选项卡)三
今天分享下移动端原生js的无缝轮播图: 移动端尽量减少使用DOM操作来频繁的浪费移动端设备的性能,所以这个无缝轮播图更多的使用了transition和transform,无缝的思想和昨天分享的PC端的 ...
- SQL语句统计每天、每月、每年的数据
1.每年select year(ordertime) 年,sum(Total) 销售合计from 订单表group by year(ordertime) 2.每月select year(orderti ...
- MYSQL密码设置
当MYSQL安装成功后,root用户的密码默认是空的,有三种方式可以重新设置root账号的密码 1.用root 进入mysql后 mysql>set password =password('你的 ...
- 千份位Javascript Thousand Separator / string format
function Separator(str){ return str.split(/(\d+)(\d{3})(\d{3})(\d{3})(\d{3})/).join(',').replace(/^, ...
- 未能加载文件或程序集“XXXXX”或它的某一个依赖项。试图加载格式不正确的程序。
未能加载文件或程序集“FastColoredTextBox, Version=2.10.5.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项.试图加载 ...
- Expectation maximization - EM算法学习总结
原创博客,转载请注明出处 Leavingseason http://www.cnblogs.com/sylvanas2012/p/5053798.html EM框架是一种求解最大似然概率估计的方法.往 ...
- Ubuntu下eclipse安装svn插件
好记性不如烂笔头,碰见一个不大不小的问题,记录下. 系统:Ubuntu 12.04 Eclipse:eclipse-jee-kepler-R-linux-gtk.tar.gz subclipse:1. ...
- Jmeter测试webocket协议
Jmeter本身不支持websocket协议的,所以需要安装第三方的插件还有6个依赖包. 首先,我们需要准备Jmeter的WebSocket协议的支持插件: JMeterWebSocketSample ...
- scrollview中套listView的问题,记录一下。
开发一个订单详情界面,详情界面上面要显示收货地址.订单总金额等,中间部分要一个listView,下面还有一些东西 但是一个界面显示不全,肯定要scrollview,然后发现listView竟然只显示第 ...