题意:给n个数,和m个大小关系,问有多少个数能确定他在这个数列中大小的排名。
题解:floyd_warshall算法,大小关系就用路表示dis[i][j]==1表示i,j关系已知且i<j;
更新就是i<k,k<j得i<j;
搞完之后,检查一遍,如果一个点和其他n-1个点都明确了关系,这个点的名次就定了。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int dis[5000][5000]; int n; void warshall_floyd(){ int k,i,j; for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) if(dis[i][k]&&dis[k][j])dis[i][j]=1; return ; } int main(){ int m,a,b,i,j; scanf("%d%d",&n,&m); while(m--){ scanf("%d%d",&a,&b); a--,b--; dis[a][b]=1; } warshall_floyd(); int res=0,ans=0; for(i=0;i<n;i++){ ans=0; for(j=0;j<n;j++) if(dis[i][j]||dis[j][i])ans++; if(ans==n-1)//自己不算 res++; } printf("%d\n",res); }