带宽问题; 回溯法+剪枝的巅峰杰作;算法经典入门;
2010-06-13 13:00
501 查看
#include <stdlib.h> #include <stdio.h> #include <string.h> #define MIN -10000000 typedef struct { int edge[100][100]; int vex; }Graph; int permu[100]; //结点排列次序 int bPermu[100]; //最佳排列 int appear[100]; //使用标记 int rank[100]; //顶点的度 Graph g; int b=MIN,bestB=-MIN; void getB(int cur) { int i; if(cur==g.vex) { if(b<bestB) { for(i=0;i<cur;++i) { bPermu[i]=permu[i]; } bestB=b; } return; } else { for(i=0;i<g.vex;++i) { if(!appear[i]) { int tmp=b; appear[i]=1; permu[cur]=i; int maxb=MIN,left=rank[i],k; for(k=0;k<cur;++k) { if(g.edge[i][permu[k]]!=0) { if(cur-k>maxb) { maxb=cur-k; } --left; } } if(maxb<bestB) { if(left<bestB) { if(maxb>b) { b=maxb; } getB(cur+1); } } appear[i]=0; b=tmp; } } } } int main() { memset(appear,0,sizeof(appear)); memset(rank,0,sizeof(rank)); scanf("%d",&g.vex); int i,j; for(i=0;i<g.vex;++i) { for(j=0;j<g.vex;++j) { scanf("%d",&g.edge[i][j]); rank[i]+=g.edge[i][j]; } } getB(0); printf("/n"); for(i=0;i<g.vex;++i) { printf("%d,",bPermu[i]); } printf("/n%d/n",bestB); return 0; } /* 5 1 1 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 */
问题描述: 给定一个无向图G,求一个顶点的排列,使图上结点与相邻结点在排列内的最大距离最小.
回溯,剪枝如书上所说.
相关文章推荐
- 算法入门经典 7.4.4 带宽问题 回溯 剪枝
- [算法入门经典] 区间最少覆盖问题 UVA 10020 - Minimal coverage
- 算法竞赛入门经典: 第三章 数组和字符串 3.2开灯问题
- 算法竞赛入门经典 例3-1开灯问题
- 刘汝佳p39,3-2(开灯问题)算法竞赛入门经典第二版
- Uva 101 the block problem 木块问题(算法竞赛经典入门)STL vector
- 经典算法(1)——8皇后问题求解(回溯法)
- 算法之路二:刘汝佳算法竞赛入门经典 3.4竖式问题
- 算法之路二:刘汝佳算法竞赛入门经典:STL不定长数组 木块问题 UVA101
- 算法竞赛入门经典 8.3.2循环日程表问题
- 算法竞赛入门经典-开灯问题
- DP DAG 9-3硬币问题(算法竞赛入门经典p162)
- 【算法竞赛入门经典】7.7 回溯法求连通块 例题7-14 UVa1602
- [算法入门经典] 7.5.3 八数码问题 | HDU 1043
- 算法竞赛入门经典训练指南-P4例题3 分金币问题总结
- 算法竞赛入门经典 7.5.3 八数码问题
- 【算法竞赛入门经典】多阶段决策问题 例题9-4 UVa116
- 算法竞赛入门经典 开灯问题
- 算法竞赛入门经典:第七章 暴力求解法 7.18倒水问题
- 算法之路二:刘汝佳算法竞赛入门经典 3.2开灯问题