poj 3660 floyed传递闭包
题意: 给定N点 每个点的等级不同,给定 m 边 表示 n 点相互的的大小关系 ,求可以有多少点等级可以确定
思路 :一个点 若和其他N-1点有关系 就可以确定他的位置 否则不可以
所以 Floyd 跑出关系来 也就是跑个闭包
关于floyd的其他东西 https://blog.csdn.net/wzw1376124061/article/details/69870161
#include<cstdio> #include<iostream> #include<queue> #include<cstring> #include<cmath> using namespace std; #define pb push_back #define fi first #define se second #define pii pair<int,int> #define mp make_pair const int N=100+4; const int INF = 1E9+4; int n,m; int d[N][N]; //题意: 给定N点 m边 表示n点的大小关系 求可以确定的 点的等级 // 思路 一个点 若和其他N-1点有关系 就可以确定他的位置 否则不可以 // 所以 Floyd 跑出关系来 也就是跑个闭包 int main(){ while(cin>>n>>m){ memset(d,0,sizeof(d)); int a,b; for(int i=0;i<m;++i) scanf("%d %d",&a,&b),d[a][b]=1; int ans= 0 ; //走一段 for(int k=1;k<=n;++k){ for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ d[i][j] = d[i][j]|(d[i][k]&&d[k][j]); } } } for(int i=1;i<=n;++i){ int cnt =0 ; for(int j=1;j<=n;++j) if(d[i][j] || d[j][i])cnt++; if(cnt==n-1)ans++; } cout<<ans<<endl; } return 0; }