syhd142  
日历
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
统计
  • 随笔 - 23
  • 文章 - 122
  • 评论 - 31
  • 引用 - 0

导航

常用链接

留言簿(2)

随笔档案(23)

文章分类(270)

文章档案(122)

我的豆瓣

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
简单回溯,枚举所有情况,在linux下用Emacs编译有点不习惯,编码调试都花了不少时间, 希望以后熟练之后会好很好多。
#include <stdio.h>
#include 
<string.h>

#define N 30

int g[N][N], num[10], ans[10], top, bandwidth, mostBand;
bool mk[N], vst[N];

inline 
int ABS(int x) {
    
return x > 0 ? x : -x;
}

void dfs(int u, const int &n) {
    num[top
++= u;
    
if(top == n) {
        bandwidth 
= 0;
        
for(int i = 0; i < n; i++) {
            
for(int j = i + 1; j < n; j++) {
                
if(g[num[i]][num[j]]) {
                    
if((j - i) > bandwidth){
                        bandwidth 
= (j - i);
                    }
                }
            }
        }
        
if(bandwidth < mostBand) {
            
for(int k = 0; k < n; k++) {
                ans[k] 
= num[k];
            }
            mostBand 
= bandwidth;
        }
    }
    
else {
        
for(int i = 0; i < 26; i++) {
            
if(mk[i] && !vst[i]) {
                vst[i] 
= 1;
                dfs(i, n);
                vst[i] 
= 0;
            }
        }
    }
    top
--;
}

int main()
{
    //freopen(
"in""r", stdin);
    
char data[1005];
    
while(gets(data), strcmp(data, "#")) {
        memset(g, 
0sizeof(g));
        memset(mk, 
0sizeof(mk));
        memset(vst, 
0sizeof(vst));
        mostBand 
= 100;
        
char *p;
        
int l, a, b, n = 0;
        p 
= strtok(data, ";");
        
while(p) {
            l 
= strlen(p);
            mk[a 
= p[0- 'A'= 1;
            
for(int i = 2; i < l; i++) {
                b 
= p[i] - 'A';
                mk[b] 
= 1;
                g[a][b] 
= g[b][a] = 1;
            }
            p 
= strtok(NULL, ";");
        }
        
for(int i = 0; i < 26; i++) {
            
if(mk[i]) n++;
        }
        
/*    printf("n = %d\n", n);
        for(int i = 0; i < 8; i++) {
            for(int j = 0; j < 8; j++) {
                if(g[i][j])printf("%c->%c\n", 'A' + i, 'A' + j);
            }
            printf("\n");
            }
*/
        
for(int i = 0; i < 26; i++) {
            top 
= 0;
            
if(mk[i] && !vst[i]) {
                vst[i] 
= 1;
                dfs(i, n);
                vst[i] 
= 0;
            }
        }
        
for(int i = 0; i < n; i++) {
            printf(
"%c ", ans[i] + 'A');
        }
        printf(
"-> %d\n", mostBand);
    }
}
posted on 2010-11-03 21:04 Fucker 阅读(403) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPC简单回溯(Dfs)

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Fucker Powered by: 博客园 模板提供:沪江博客