欧拉回路 (洛谷1341 无序字母对)

给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

输入样例#1:
4
aZ
tZ
Xt
aX
输出样例#1:
XaZtX
 
 1 #include<bits/stdc++.h>
 2 #define maxn 999 
 3 using namespace std;
 4 
 5 int du[maxn];
 6 int book[maxn][maxn];
 7 stack<int> s;
 8 int n;
 9 int number[maxn];
10 int ans[20000];
11 void dfs(int k,int num)
12 {
13     ans[num]=k;
14     if(num==n+1)
15     {
16         for(int i=1;i<=n+1;i++)
17           cout<<char(ans[i]+'A');
18           exit(0);
19     }
20    for(int i=0;i<65;i++)//保证了字典序 
21        if(book[i][k])
22        {
23            book[i][k]=book[k][i]=0;
24            dfs(i,num+1);
25            book[i][k]=book[k][i]=1;
26           
27        }    
28        return ;
29     
30 }
31 
32 
33 int main()
34 {
35     cin>>n;
36     char  str[2];int A,B;
37     for(int i=0;i<n;i++)
38      { 
39          scanf("%s",str);
40            A=str[0]-'A';
41            B=str[1]-'A';
42            du[A]++;
43            du[B]++;
44            book[A][B]=book[B][A]=1;
45      }
46        int sum=0;
47      for(int i=0;i<65;i++)
48         if(du[i]%2)
49             number[sum++]=i;
50     if(sum==1||sum>2)  printf("No Solution\n");
51     else
52     {
53          if(sum==2)
54          {
55             if(number[0]<number[1])
56             
57                 dfs(number[0],1);
58             else
59                dfs(number[1],1);
60          }//二个奇点的情况
61          else
62          {
63             for(int i=0;i<65;i++)
64               if(du[i])
65               {
66                  dfs(i,1);
67                  break;
68               }
69          } 
70     
71     }
72    return 0;
73 }
 1 #include<bits/stdc++.h>
 2 #define maxn 999 
 3 using namespace std;
 4 
 5 int du[maxn];
 6 int book[maxn][maxn];
 7 stack<int> s;
 8 int n;
 9 int number[maxn];
10 
11 void dfs(int k)
12 {
13     for(int i=0;i<70;i++)//保证了字典序 
14        if(book[i][k])
15        {
16            book[i][k]=book[k][i]=0;
17            dfs(i);
18            s.push(i);//因为是倒推,所以用堆来储存 
19        }    
20     
21 }
22 
23 
24 int main()
25 {
26     cin>>n;
27     char  str[2];int A,B;
28     for(int i=0;i<n;i++)
29      { 
30          scanf("%s",str);
31            A=str[0]-'A';
32            B=str[1]-'A';
33            du[A]++;
34            du[B]++;
35            book[A][B]=book[B][A]=1;
36      }
37        int sum=0;
38      for(int i=0;i<70;i++)
39         if(du[i]%2)
40             number[sum++]=i;
41     if(sum==1||sum>2)  printf("No Solution\n");
42     else
43     {
44          if(sum==2)
45          {
46             dfs(number[0]);
47             s.push(number[0]);
48          }//二个奇点的情况
49          else
50          {
51             for(int i=0;i<70;i++)
52               if(du[i])
53               {
54                  dfs(i);
55                  s.push(i);
56                  break;
57               }
58          } 
59     
60         while(!s.empty())
61           {
62              cout<<char(s.top()+'A');
63              s.pop();
64           }
65     }
66    return 0;
67 }

两类dfs的代码~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值