题意:有n(n<=10000)头牛,每头牛都想成为最受欢迎的牛,给出m(m<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不是相互的,那么就是说1欢迎2不代表2欢迎1,但是如果2欢迎3那么1也欢迎3.

输入第一行为n,m第2到1+m行为m个欢迎关系,求被所有牛都欢迎的牛的数量。

思路:Tarjan求强联通分量做。

1.如果图不联通,直接输出零。(不解释)

2.如果有超过1个出度=0的点,直接输出零。因为它肯定不是最受欢迎的牛。

3.如果只有一个出度等于零的点,那它的强联通分量里的所有点都是最受欢迎的牛。

题目在这里

#include <stack>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int low[10005],dfn[10005],n,m,cnt=0,t=0,p[10005],out[10005],ans=0;
bool vis[10005];
stack<int>stk;
vector<int>v[10005];
void tarjan(int x)
{
low[x]=dfn[x]=++cnt,vis[x]=1,stk.push(x);
for(int i=0;i<v[x].size();i++)
if(!dfn[v[x][i]])
tarjan(v[x][i]),low[x]=min(low[v[x][i]],low[x]);
else if(vis[v[x][i]])
low[x]=min(low[x],dfn[v[x][i]]);
if(dfn[x]==low[x]){
int y;t++;
do y=stk.top(),stk.pop(),vis[y]=0,p[y]=t;while(y!=x);
}
}
int main()
{
register int x,y,q;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d",&x,&y),v[x].push_back(y);
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)
for(int j=0;j<v[i].size();j++)
if(p[v[i][j]]!=p[i])out[p[i]]++;
for(int i=1;i<=t;i++)
if(!out[i])ans++,q=i;
if(ans==1){
for(int i=1;i<=n;i++)if(p[i]==q)ans++;
printf("%d",ans-1);
}
else puts("0");
}

// by Sirius_Ren
#include <stack>
#include <cstdio>
#define f(X) for(int i=1;i<=X;i++)
using namespace std;
stack<int>s;
int xx,yy,n,m,tot=1,cnt=1,t=0,first[10005],next[50005],v[50005],low[10005],dfn[10005],p[10005],vis[10005],out[10005];
void add(int x,int y){v[tot]=y;next[tot]=first[x];first[x]=tot++;}
void tarjan(int x){
dfn[x]=low[x]=cnt++,vis[x]=1,s.push(x);
for(int i=first[x];i;i=next[i])
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[v[i]],low[x]);
else if(vis[v[i]])low[x]=min(dfn[v[i]],low[x]);
if(low[x]==dfn[x]){t++;do xx=s.top(),s.pop(),vis[xx]=0,p[xx]=t;while(xx!=x);}
}
int main(){
scanf("%d%d",&n,&m);
f(m)scanf("%d%d",&xx,&yy),add(xx,yy);
f(n)if(!dfn[i])tarjan(i);
f(n)for(int j=first[i];j;j=next[j])if(p[v[j]]!=p[i])out[p[i]]++;
yy=-1;
f(t)if(!out[i])yy++,xx=i;
if(!yy){f(n)if(p[i]==xx)yy++;printf("%d\n",yy);}
else puts("0");
}

第二遍

最新文章

  1. iOS Xcode, 解决“Could not insert new outlet connection: Could not find any information for the class named”的问题。
  2. &lt;转&gt;SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY
  3. CCNA第四章第五章Cisco的IOS与SDM及其管理考试要点学习笔记
  4. Jquery学习之基础篇二
  5. 让谷歌浏览器 chrome 支持小于12px的字体
  6. Python学习路程day4
  7. Maven相关: An internal error occurred during: &quot;Updating Maven Project&quot;. java.lang.NullPointerException
  8. 面经-csdn
  9. 在PHP中如何获取用户的真实IP
  10. OSS研究
  11. python 查看插件命令 pip freeze 以及django3.4链接mysql
  12. Apache开启expires响应头,优化缓存
  13. window批量-6 rem
  14. 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
  15. nodejs 使用mongoose 操作mongodb
  16. LogCook 一个简单实用的Android日志管理工具
  17. [经验共享]&#160;MapGIS实用小功能图解——由excel文件导成MapGIS点文件
  18. Collect devices information
  19. Docker Kubernetes Service 网络服务代理模式详解
  20. 关于plsqldev无法正常加载oracle instantclient中的oci.dll的其中一个原因

热门文章

  1. iOS 中plist文件中配置key值冲突的现象
  2. MongoDB主库和从库的数据大小不一致原因判断
  3. 1. Python中的基本数据类型、运算、变量
  4. Serial Fluent UDF on Windows
  5. hdu2009 求数列的和【C++】
  6. 【Codeforces 27A】Next Test
  7. 虚拟机win7 自动休眠
  8. ubuntu消除登录痕迹
  9. android:怎样用一天时间,写出“飞机大战”这种游戏!(无框架-SurfaceView绘制)
  10. 天了噜,我国4G用户超过2亿了!