luogu p2149 [USACO08JAN]牛大赛Cow Contest
原题链接:https://www.luogu.org/problem/show?pid=2419
这个题看一眼数据范围,100,嗯。。。。。。n^3做法,想了想会的算法,Floyd(太弱不会别的算法)。
luogu的题解,很多人直接写了考虑边权的Floyd,而这道题,我们只需要考虑两点之间能否到达就可以了,也就是说e其实可以开成bool数组。
与Floyd一样,枚举中间点与两个点,如果i能到达k,k能到达j,那么i也能到达j。
然后遍历e数组,检查各点能到达的点的数目,如果为n-1(自己不算),那么该点就能确定了。
非边权的写法优点:无需预处理填充无限大值,无需考虑大小问题。但是只适用于只考虑能否到达的问题。
#include<cstdio> int e[105][105],s[105],n,m,x,y,ans; int main() { scanf("%d %d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d %d",&x,&y); e[x][y]=1; } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(e[i][k]&&e[k][j]) e[i][j]=1; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if (e[i][j]) { s[i]++; s[j]++; } } } for(int i=1;i<=n;i++) if(s[i]==n-1) ans++; printf("%d",ans); return 0; }