F - Cow Contest

题目描述

Floyd 从老马的抽屉里发现了一张自驾地图,现在地图上有 N (1 ≤ N ≤ 100) 座城市,依次标号为 1, 2, ..., N, 城市之间由 M (1 ≤ M ≤ 4,500) 条单向边相连。给定输入的 M 条单向边后(地图上保证没有自环且没有重复的单向边),你可以帮助 Floyd 确定繁华城市的个数 N* 吗?
繁华城市的定义为:如果一个城市 x 与其他 N-1 个城市都存在拓扑关系,那么我们可以称这个城市 x 为一个繁华城市
拓扑关系的定义为:如果两个城市 x 和 y 之间存在至少一条单向通路,如 x → … → y,或者 y → … → x,那么我们称城市 x 和 y 之间存在拓扑关系
单向通路的定义为:若干条(至少一条)首尾相连的单向边组成的一条路径,我们称之为单向通路

输入

输入仅包含一组数据:
第 1 行包含两个整数 N 和 M,由空格分开;
随后 M 行(也就是第 2 行到第 M+1 行)输入各条单向边,每行含有两个由空格隔开的整数 x 和 y,代表着从城市 x 出发到城市 y 结束存在一条单向边(为了简化题目描述,你可以认为单向边 xy 的长度为任何值,它只是单纯的起到连接城市的作用)

输出

输出包含唯一行整数,即 N* 的值。

样例

样例输入copy 样例输出copy
5 5
4 3
4 2
3 2
1 2
2 5
2

样例提示

在给定样例的五个城市中共有两个繁华城市:
城市 1 仅能与 城市 2(1 → 2)、城市 5(1 → 2 → 5)确立拓扑关系,所以城市 1 不是繁华城市;
城市 2 可以与其他四个城市,也就是城市 1(1 → 2)、城市 3(3 → 2)、城市 4(4 → 2 或 4 → 3 → 2)、城市 5(2 → 5)确立拓扑关系,所以城市 2 是一个繁华城市;
城市 3 不是繁华城市,因为它无法与城市 1 确立拓扑关系;
城市 4 不是繁华城市,因为它无法与城市 1 确立拓扑关系;
城市 5 是一个繁华城市,因为可以与其他任何城市确立拓扑关系。

#include<iostream>
#include<cstring>
using namespace std;
int n,m,x,y,ans=0,res=0,g[1010][1010];
void floyd(){
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){

            if(g[i][k]==1&&g[k][j]==1)
               g[i][j]=1;
            }
            
}
int main(){
    cin>>n>>m;
    memset(g,0,sizeof(g));
    while(m--){
        cin>>x>>y;
        g[x][y]=1;
    }
    floyd();
    for(int i=1;i<=n;i++){
    ans=0;
    for(int j=1;j<=n;j++)
    {
    if(g[i][j]==1||g[j][i]==1)
    ans++;
    }
    if(ans==n-1) res++;
    }
 cout<<res<<endl;
}

猜你喜欢

转载自blog.csdn.net/m0_74310050/article/details/130173734