luogu 1314 欧拉回路

欧拉路径:一笔画的路径

欧拉回路:一笔画的回路

两者判断方法一样但是输出略有不同。并且还有Fleury(弗罗莱)算法,但是我不会。.

这里就用dfs就好

判断条件:

1)图的连通性(可用并查集判断)

2)无向/有向的路径/回路拥有的特性

思路:1)寻找连边,有的话继续深搜

           2)无连边的话,入栈/输出

           回路               路径                     备注

无向   度全偶         全偶/两奇余偶       同/反皆可,一般反

有向   入=出(0)        1,-1,0                   输出与dfs序同

有向图需要入栈并且dfs后逆序输出

e.g.:luogu 1314 无序字母对

#include<bits/stdc++.h>

using namespace std;
const int N=605;
const int inf=0x3f3f3f3f;
int n,inn[N],cnt,s[N],mp[N][N],top;

string S = "No Solution";

inline int judge(char x){
    if('a'<=x&&x<='z') return x-'a'+27;
    else return x-'A'+1;}
    
inline char prt(int x){
    if(x<=26) return x+'A'-1;
    return x+'a'-27;}

inline void insert(int u,int v){
    ++inn[u];++inn[v];
    mp[u][v]=mp[v][u]=1;}
    
void dfs(int u){
    for(int v=1;v<=52;v++)
       if(mp[u][v]){
             mp[u][v]=mp[v][u]=0;dfs(v);}
    s[++top]=u;}
        
int main(){
    cin>>n;
    char ch[5]; 
    for(int i=1;i<=n;i++){
        scanf("%s",ch);
        insert(judge(ch[0]),judge(ch[1]));}
        
    int p=inf;
    for(int i=1;i<=52;i++)
        if(inn[i]&1)//欧拉路径起点:奇数
        p = min(p,i),++cnt;
        
    if(cnt!=0&&cnt!=2){
        cout<<S;return 0;}
    if(cnt == 0)//欧拉回路起点,找最小
       for(int i=1;i<=52;i++) 
       if(inn[i]){p = i;break;}
    
    dfs(p);
    for(int i=top;i>=1;--i) printf("%c",prt(s[i])); return 0;
}

 

posted @ 2018-08-27 16:20  ASDIC减除  阅读(126)  评论(0编辑  收藏  举报