1. 程式人生 > >2018 ACM-ICPC亞洲區域賽 北京賽區

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