1. 程式人生 > >ACM-ICPC北京賽區2018重現賽 A題

ACM-ICPC北京賽區2018重現賽 A題

具體思路:dfs,判斷矛盾就可以了。

AC程式碼:

#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<stack>
#include<stdio.h>
#include<cmath>
#include<map>
#include<vector>
using namespace std;
# define inf 0x3f3f3f3f
# define maxn 100+100
# define ll long long
map<string,bool>vis;
map<string,int>q;
int father[maxn];
int k;
void dfs(int t1,int t2)
{
    if(k==1)return ;
    if(t1==t2)
    {
        k=1;
        return ;
    }
    if(father[t1]==t1)return ;
    dfs(father[t1],t2);
}
int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(cin>>n)
    {
        vis.clear();
        q.clear();
        int flag=0;
        for(int i=1; i<=maxn; i++)
        {
            father[i]=i;
        }
        int s1,s2;
        int num=0;
        string t1,t2;
        for(int i=1; i<=n; i++)
        {
            cin>>t1>>t2;
            if(vis[t1]==0)
            {
                vis[t1]=1;
                q[t1]=++num;
            }
            if(vis[t2]==0)
            {
                vis[t2]=1;
                q[t2]=++num;
            }
            k=0;
            dfs(father[q[t1]],q[t2]);
            if(k==1&&flag==0)
            {
                flag=1;
                cout<<t1<<" "<<t2<<endl;
            }
            father[q[t2]]=q[t1];
        }
        if(flag==0)cout<<0<<endl;
    }
    return 0;
}