poj3660(floyd求傳遞閉包)

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
const int inf = 0x3f3f3f3f;
int mp[200][200];
void init(){
    for(int i = 0;i<=100;++i){
        for(int j = 0;j<=100;++j){
            mp[i][j] = inf;
        }
    }
}
void floyd(){
    int k,i,j;
    for(int k = 1;k<=n;++k){
        for(int i = 1;i<=n;++i){
            for(int j = 1;j<=n;++j){
                if(mp[i][j]>mp[i][k]+mp[k][j]){
                    mp[i][j] = mp[i][k]+mp[k][j];
                }
            }
        }
    }

}
int main(){
    scanf("%d%d",&n,&m); init();
    for(int i = 1;i<=m;++i){
        int u,v;
        scanf("%d%d",&u,&v);
        mp[u][v] = 1;
    }


    floyd();

    int cnt = 0;
    for(int i =1;i<=n;++i){
        int flag = 0;
        for(int j = 1;j<=n;++j){
            if(mp[i][j]==inf&&mp[j][i]==inf&&i!=j){
                flag = 1;
            }
        }
        if(!flag){
            cnt++;
        }
    }
    cout<<cnt<<endl;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章