标签:idt sar work ram ble sch std cst return
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16571 | Accepted: 6558 |
Description
Input
Output
Sample Input
5 2 4 3 0 4 5 0 0 0 1 0
Sample Output
1 2
Source
给定一个n (n<=100)个点的有向图,问:
Q1、最少需要选择多少个点,使得从这些点出发能遍历完整个图;
Q2、最少需要添加多少条有向边,使得整个图成为连通图;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N=105; typedef long long ll; inline int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f; } int n; struct edge{ int v,ne; }e[N*N]; int h[N],cnt=0; inline void ins(int u,int v){ cnt++; e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt; } int dfn[N],low[N],belong[N],dfc,scc; int st[N],top=0; void dfs(int u){ dfn[u]=low[u]=++dfc; st[++top]=u; for(int i=h[u];i;i=e[i].ne){ int v=e[i].v; if(!dfn[v]){ dfs(v); low[u]=min(low[u],low[v]); }else if(!belong[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]){ scc++; while(true){ int x=st[top--]; belong[x]=scc; if(x==u) break; } } } int outd[N],ind[N]; void point(){ for(int u=1;u<=n;u++) for(int i=h[u];i;i=e[i].ne){ int v=e[i].v; if(belong[u]!=belong[v]) outd[belong[u]]++,ind[belong[v]]++; } } int main(){ n=read(); for(int u=1;u<=n;u++){ int v=read(); while(v!=0){ins(u,v);v=read();} } for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i); point(); int cnt1=0,cnt2=0; for(int i=1;i<=scc;i++){ if(ind[i]==0) cnt1++; if(outd[i]==0) cnt2++; } if(scc==1) printf("1\n0"); else printf("%d\n%d",cnt1,max(cnt1,cnt2)); }
POJ1236Network of Schools[tarjan 缩点]
标签:idt sar work ram ble sch std cst return
原文地址:http://www.cnblogs.com/candy99/p/5989069.html