欧拉回路/通路 Codeforces Round #288 (Div. 2)

http://codeforces.com/contest/508/problem/D

以上是题目链接

题目大意 给n个字符串看能不能链接在一起

因为 三个三个分割 所以字符串  如abc ab作为起点 bc作为终点

hash思想 加细节处理 欧拉图均满足

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#include<cctype>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+7;
const int64 Mod=100000007;
const double eps=1e-9;
const int N=8e3;
const int MAXN=250050;
typedef int rl;
inline void r(rl&num){
    num=0;rl f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
    num*=f;
}
int gt(char a)//hash
{
    if(isdigit(a)) return a-'0';
    if(islower(a)) return a-'a'+10;
    return a-'A'+36;
}
int ha(char a,char b)
{
    return gt(a)*100+gt(b);
}
char fg(int a)
{
    if(a<10)return a+'0';
    if(a<=gt('z')) return a-10+'a';
    return a-36+'A';
}
vector<int>v[N];
string ss;
void dfs(int x)
{
    while(!v[x].empty()){
        int tem=v[x].back();
        v[x].pop_back();
        dfs(tem);
    }
    ss+=fg(x%100);
    //cout<<ss<<endl;
}
int ind[N];
int main()
{
    char ch[3];
    int n;
    r(n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",ch);
        int s=ha(ch[0],ch[1]),e=ha(ch[1],ch[2]);
        v[s].push_back(e);
        ind[s]++;ind[e]--;
    }
    int st=-1,out=0;//-1表示回路
    for(int i=0;i<N;i++)
    {
        if(ind[i]>=1){
            st=i;
            out++;
        }
    }
    if(out>1||ind[st]>1)//ind[s] 表示图仅有一个点指向多个点构成
    {
        puts("NO");
        return 0;
    }
    if(st==-1)
    {
        for(int i=0;i<N;i++)
        {
            if(!v[i].empty())
            {
                st=i;
                break;
            }
        }
    }
    dfs(st);
    ss+=fg(st/100);
    if(ss.size()==n+2)
    {
        puts("YES");
       for(int i=n+1;i>=0;i--)
            cout<<ss[i];
    }
    else{
        puts("NO");
    }
    return 0;
}
欧拉
原文地址:https://www.cnblogs.com/Geek-xiyang/p/5353306.html