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

题目:

解题思路:

我好菜啊!!

首先可以n2搞定,而对于每个点,又可以在当前不优的状态下将不好的状态拼到后面。

最后回溯搞定。

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 int n;
 5 bool r[1000][1000];
 6 int ind[1000];
 7 int ans[1000];
 8 char cmd[10];
 9 int cnt;
10 int tot;
11 void dfs(int x)
12 {
13     
14     for(int i='A';i<='z';i++)
15         if(r[x][i])
16         {
17             r[x][i]=r[i][x]=false;
18             dfs(i);
19         }
20     ans[++tot]=x;
21 }
22 int main()
23 {
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++)
26     {
27         scanf("%s",cmd+1);
28         r[cmd[1]][cmd[2]]=r[cmd[2]][cmd[1]]=true;
29         ind[cmd[1]]++;
30         ind[cmd[2]]++;
31     }
32     for(int i='A';i<='z';i++)
33         if(ind[i]&1)
34             cnt++;
35     if(cnt!=0&&cnt!=2)
36     {
37         puts("No Solution");
38         return 0;
39     }
40     int sta;
41     for(int i='z';i>='A';i--)
42         if(ind[i])
43         {
44             if(cnt)
45             {
46                 if(ind[i]&1)
47                     sta=i;
48             }else
49                 sta=i;
50         }
51     dfs(sta);
52     if(tot!=n+1)
53     {
54         puts("No Solution");
55         return 0;
56     }
57     for(int i=tot;i;i--)
58         printf("%c",ans[i]);
59     puts("");
60     return 0;
61 }

 

posted @ 2018-10-14 23:41  Unstoppable728  阅读(146)  评论(0编辑  收藏  举报