您的位置:首页 > 其它

带宽问题; 回溯法+剪枝的巅峰杰作;算法经典入门;

2010-06-13 13:00 411 查看
#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,求一个顶点的排列,使图上结点与相邻结点在排列内的最大距离最小.

 

回溯,剪枝如书上所说.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 include graph struct