题目描述
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;
}