#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,求一个顶点的排列,使图上结点与相邻结点在排列内的最大距离最小. 回溯,剪枝如书上所说.