算法入门经典 7.4.4 带宽问题 回溯 剪枝

来源:互联网 发布:linux kernel启动参数 编辑:程序博客网 时间:2024/06/06 14:13
#include <stdio.h>#include <string.h>#define maxn 10struct graph{int adj[maxn][maxn];int vex;}g;int vis[maxn];int deg[maxn];int perm[maxn];int bestperm[maxn];int bestw = maxn, maxw = -1;void search_width(int cur){int i;if(cur >= g.vex){if(maxw < bestw){for(i = 0; i < g.vex; ++i)bestperm[i] = perm[i];bestw = maxw;}return;}for(i = 0; i < g.vex; ++i){if(!vis[i]){int tmp = maxw;vis[i] = 1;perm[cur] = i; int k, left = deg[i]; for(k = 0; k < cur; ++k) if(g.adj[i][k]){ if(cur - k > maxw)maxw = cur - k; if(maxw < bestw) --left; else break; }if(maxw < bestw){if(left < bestw){search_width(cur+1);}}vis[i] = 0;maxw = tmp;}}}int main(){int i, j;memset(vis, 0, sizeof(vis));memset(deg, 0, sizeof(deg));scanf("%d", &g.vex);for(i = 0; i < g.vex; ++i)for(j = 0; j < g.vex; ++j){scanf("%d", &g.adj[i][j]);deg[i] += g.adj[i][j];}search_width(0);for(i = 0; i < g.vex; ++i)printf("%d ", bestperm[i]);printf("\n%d\n", bestw);return 0;}

0 0
原创粉丝点击