2018 ACM-ICPC亞洲區域賽 北京賽區
阿新 • • 發佈:2018-11-23
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;
}