HDU [P1704] Rank

传递闭包裸题

但是本题的Floyd一定要优化,不然会T

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int init(){
   int rv=0,fh=1;
   char c=getchar();
   while(c<'0'||c>'9'){
   	if(c=='-') fh=-1;
   	c=getchar();
   }
   while(c>='0'&&c<='9'){
   	rv=(rv<<1)+(rv<<3)+c-'0';
   	c=getchar();
   }
   return fh*rv;
}
int T,n,m,dis[505][505],cnt;
int main(){
   T=init();
   while(T--){
   	n=init();m=init();
   	memset(dis,0,sizeof(dis));
   	cnt=0;
   	for(int i=1;i<=m;i++){
   		int u=init(),v=init();
   		dis[u][v]=1;
   	}
   	for(int k=1;k<=n;k++){
   		for(int i=1;i<=n;i++){
   			if(dis[i][k]){
   				for(int j=1;j<=n;j++){
   					dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);
   				}
   			}
   		}
   	}
   	for(int i=1;i<=n;i++){
   		for(int j=1;j<=n;j++){
   			if(dis[i][j]) cnt++;
   		}
   	}
   	cout<<(n*n-n-cnt*2)/2<<endl;
   }
   return 0;
}
posted @ 2018-01-15 18:42  Mr_Wolfram  阅读(141)  评论(0编辑  收藏  举报