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;
}

 

posted on 2018-10-08 20:15  Helpp  阅读(115)  评论(0编辑  收藏  举报

导航