UVa-140 Bandwidth

  1 #include <bits/stdc++.h>
  2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
  3 using namespace std;
  4 
  5 const char a[27] = {'A','B','C','D','E','F','G','H','I','J',
  6                     'K','L','M','N','O','P','Q','R','S','T',
  7                     'U','V','W','X','Y','Z'
  8                    };
  9 char s[393] {0};
 10 int m[27][27] {0};
 11 char rnts[39] {0};
 12 int rnt = INT_MAX;
 13 char ns[39] {0};
 14 int n;
 15 
 16 void addedge(int a,int b)
 17 {
 18     m[a][b] = m[b][a] = 1;
 19 }
 20 void read()
 21 {
 22     _for(i,0,strlen(s))
 23         if(s[i]==':')
 24             for(int j = i+1;s[j]!='\0'&&s[j]!=';';j ++)
 25                 addedge(s[i-1]-'A',s[j]-'A');
 26 }
 27 
 28 void dfs()
 29 {
 30     if(strlen(s)==1)
 31     {
 32         rnt = 0;
 33         rnts[0] = s[0];
 34         n = 1;
 35         return ;
 36     }
 37     int hash[27] {0};
 38     _for(i,0,27)
 39         _for(j,0,27)
 40             if(m[i][j])
 41                 hash[j] ++;
 42     int ns_end = 0;
 43     _for(i,0,27)
 44         if(hash[i])
 45             ns[ns_end++] = 'A'+i;
 46     n = ns_end;
 47     do
 48     {
 49         int maxt = INT_MIN;
 50         _for(i,0,27)
 51         {
 52             int maxtn = INT_MIN;
 53             _for(j,0,27)
 54             {
 55                 if(m[i][j])
 56                 {
 57                     int ai,bi;
 58                     _for(k,0,27)
 59                     {
 60                         if(ns[k]=='A'+i)
 61                             ai = k;
 62                         if(ns[k]=='A'+j)
 63                             bi = k;
 64                     }
 65                     int trnt = abs(ai-bi);
 66                     maxtn = max(trnt,maxtn);
 67                 }
 68             }
 69             maxt = max(maxt,maxtn);
 70             if(maxt>rnt)
 71                 break;
 72         }
 73         if(maxt<rnt)
 74             strcpy(rnts,ns);
 75         rnt = min(rnt,maxt);
 76     }while(next_permutation(ns,ns+strlen(ns)));
 77 }
 78 
 79 void output()
 80 {
 81     _for(i,0,n)
 82         printf("%c ",rnts[i]);
 83     printf("-> %d\n",rnt);
 84 }
 85 
 86 int main()
 87 {
 88     while(scanf("%s",s)==1 && s[0]!='#')
 89     {
 90         read();
 91         dfs();
 92         output();
 93         memset(s,0,sizeof(s));
 94         memset(m,0,sizeof(m));
 95         memset(ns,0,sizeof(ns));
 96         memset(rnts,0,sizeof(rnts));
 97         rnt = INT_MAX;
 98         n = 0;
 99     }
100     return 0;
101 }

后悔上了邻接矩阵的贼船

猜你喜欢

转载自www.cnblogs.com/Asurudo/p/10050689.html