2018 ACM-ICPC亚洲区域赛 北京赛区

2018 ACM-ICPC亚洲区域赛 北京赛区

A - Jin Yong’s Wukong Ranking List

HihoCoder - 1870

题意

给N对关系,每对关系表示为A 比B 厉害,如果A比B厉害,B比C厉害,那么A比C厉害,即关系具有传递性。如果这N对关系存在矛盾,则输出矛盾的哪一个关系,否则输出0

分析

如果A比B厉害,B比A厉害就和之前的关系矛盾,构成一个环,使用DFS判断有向图是否有环即可

#include <iostream>
#include <vector>
#include <string.h>
#include<map>
using namespace std;
/*
color代表每个结点的状态,-1代表还没被访问,0代表正在被访问,1代表访问结束
如果一个状态为“0”的结点,与他相连的结点状态也为0的话就代表有环,这个可以用dfs实现
*/
vector<int> vec[120];
int color[120];
bool flag;//标记是否有环

void dfs(int x){
    if(flag){//如果有环就返回,否者继续收索
        return;
    }
    color[x] = 0;//x正在被反问,状态为0
    for(int i = 0 ; i < vec[x].size() ; i++){
        if(color[vec[x][i]] == -1){
        //与x相连的结点状态也为-1,代表还未被访问,则继续搜索
            dfs(vec[x][i]);
        } else if(color[vec[x][i]] == 0){
        //与x相连的结点状态也为0,代表有环,返回
            flag = true;
            return;
        }
    }
    color[x] = 1;//对x的访问结束
}

int main(){

    int n ;
    while(cin>>n){
        int k=1;
    for(int i=0;i<120;i++)
        vec[i].clear();

    map<string,int> mp;
    string ans1,ans2;//记录答案
    bool ans=false;//标记是否找到环

    for(int i = 0 ; i < n ; i++){//建立邻接表
        string u,v;
        cin >> u >> v;
        if(!mp[u])  mp[u]=k++;
        if(!mp[v])  mp[v]=k++;
        //cout<<mp[u]<<" "<<mp[v]<<endl;
        vec[mp[u]].push_back(mp[v]);
        flag = false;
        if(!ans){//还没找到环
        memset(color, -1, sizeof(color));
            dfs(mp[u]);
        if(flag)//存在环
            ans1=u,ans2=v,ans=true;
        }
    }
    if(ans)
        cout<<ans1<<" "<<ans2<<endl;
    else
        cout<<0<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/84258345