标签:缩点 连通 专题 int 出度 入度 maxn Kuangbin include
目录
1.POJ1236 Network of Schools(Tarjan缩点)
POJ1236 Network of Schools(Tarjan缩点)
题意:
给一张有向图,问你至少要选多少点,从这些点出发可以遍历整个图,最少要加多少条边才能使整个图联通
思路:
先对整个图进行缩点,然后统计出缩点之后每个点的出度与入度
第一个答案就为入度为0的点,第二个答案就为出度为0跟入度为0的点个数的最大值,注意要特判缩点之后点为1的情况
#include<iostream> #include<algorithm> #include<vector> #include<cstdio> using namespace std; const int maxn=105; vector<int> a[maxn]; int dfs[maxn],low[maxn],s[maxn],n,flag[maxn],tot,cnt[maxn],t,k,color[maxn]; int in[maxn],out[maxn]; void tarjan(int x) { dfs[x]=low[x]=++tot; s[++k]=x; flag[x]=1; for(int i=0;i<a[x].size();i++){ if(!dfs[a[x][i]]){ tarjan(a[x][i]); low[x]=min(low[x],low[a[x][i]]); } else if(flag[a[x][i]]) low[x]=min(low[x],dfs[a[x][i]]); } if(dfs[x]==low[x]){ t++; do{ color[s[k]]=t,cnt[t]++; flag[s[k--]]=0; }while(x!=s[k+1]); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ int temp; while(scanf("%d",&temp)&&temp) a[i].push_back(temp); } for(int i=1;i<=n;i++){ if(!dfs[i]) tarjan(i); } for(int i=1;i<=n;i++){ for(int j=0;j<a[i].size();j++){ if(color[i]!=color[a[i][j]]){ in[color[a[i][j]]]++; out[color[i]]++; } } } int ans1=0,ans2=0; for(int i=1;i<=t;i++){ if(in[i]==0) ans1++; if(out[i]==0) ans2++; } cout<<ans1<<endl; if(t==1) cout<<0; else cout<<max(ans1,ans2)<<endl; }View Code
标签:缩点,连通,专题,int,出度,入度,maxn,Kuangbin,include 来源: https://www.cnblogs.com/overrate-wsj/p/12427969.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。