程序运行之前先新建一个名为1.txt的文本,里面存储一个邻接矩阵的相关数据,如:0 3 1 5 8 23
564 0 6 654 9 5
56 6 0 4 2 123
5 654 54 0 3 6
8 9 654 3 0 12
22 25 100 23 236 0
点到其本身的权值输入0
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
void ToBinary(char *a,int num,int vexnum)
{
int i;
for(i = 0;i < vexnum;i++)
a[i] = '0';
i -= 1;
while(num != 0)
{
a[i--] = num%2 + 48;
num /= 2;
}
}
void StringAdd(char *&a,char *b,int vexnum)
{
int i;
char c = '1';
a = (char *)malloc((1+vexnum)*sizeof(char)); /
strcpy(a,b);
for(i = vexnum-1;i >= 0;i--)
{
char temp;
if(a[i] != c)
temp = '0';
else if(a[i] == '0')
temp = '0';
else temp = '1';
if(a[i] != c)
a[i] = '1';
else a[i] = '0';
c = temp;
}
}
int OneNum(char *a,int vexnum)
{
int i,count = 0;
for(i = 1;i < vexnum;i++)
if(a[i] == '1')
count++;
return count;
}
void Create(int **&D,char **&V,int **&admatrix,int **&path,int &vexnum)
{
int arcnum;
ifstream matrix,tomb;
matrix.open("1.txt");
if(!matrix)
{
cout << "Cannot open input file"<< endl;
return;
}
int c,count = 0;
while(!matrix.eof())
{
matrix >> c;
count++;
}
//cout << count << endl;
matrix.clear();
matrix.seekg(0,ios::beg);
vexnum = (int)sqrt(count);
arcnum = count-vexnum;
admatrix = (int **)malloc(vexnum*sizeof(int *));
D = (int **)malloc(vexnum*sizeof(int *));
V = (char **)malloc(pow(2,vexnum-1)*sizeof(char *));
path = (int **)malloc(vexnum*sizeof(int *));
int i,j;
for(i = 0;i < vexnum;i++)
{
admatrix[i] = (int *)malloc(sizeof(int)*vexnum);
D[i] = (int *)malloc(pow(2,vexnum-1)*sizeof(int));
path[i] = (int *)malloc(pow(2,vexnum-1)*sizeof(int));
}
for(i = 0;i < pow(2,vexnum-1);i++)
V[i] = (char *)malloc((vexnum+1)*sizeof(char)); /
for(i = 0;i < vexnum;i++)
for(j = 0;j < vexnum;j++)
admatrix[i][j] = INT_MAX;
count = 0;
while(!matrix.eof())
{
matrix >> c;
count ++;
if(count % vexnum)
admatrix[count/vexnum][count % vexnum-1] = c;
else
admatrix[count/vexnum-1][vexnum-1] = c;
}
matrix.close();
for(i = 0;i < vexnum;i++)
admatrix[i][i] = INT_MAX;
for(i = 0;i < vexnum;i++)
V[0][i] = '0';
V[0][i] = 0;
for(i = 1;i < pow(2,vexnum-1);i++)
StringAdd(V[i],V[i-1],vexnum);
/* for(i = 0;i < vexnum;i++)
{
for(int j = 0;j < vexnum;j++)
cout << admatrix[i][j] << " ";
cout << endl;
}*/
}
int Solution(int **D,char **V,int **admatrix,int **path,int vexnum)
{
int i,j,k,l;
for(i = 0;i < vexnum;i++)
for(j = 0;j < pow(2,vexnum-1);j++)
{
D[i][j] = INT_MAX;
path[i][j] = -1;
}
for(i = 1;i < vexnum;i++)
D[i][0] = admatrix[i][0];
for(k = 1;k < pow(2,vexnum-1)-1;k++)
for(j = 0;j < pow(2,vexnum-1);j++)
{
if(OneNum(V[j],vexnum) == k)
{
for(l = 1;l < vexnum;l++)
{
if(V[j][l] == '0')
{
int min = INT_MAX,tag = -1;
for(i = 0;i < vexnum;i++)
if(V[j][i] == '1')
if(admatrix[l][i]+D[i][j-(int)pow(2,vexnum-i-1)] < min)
{
tag = i;
min = admatrix[l][i]+D[i][j-(int)pow(2,vexnum-i-1)];
}
D[l][j] = min;
path[l][j] = tag;
}
}
}
}
int min = INT_MAX,tag = -1;
for(i = 1;i < vexnum;i++)
{
if(admatrix[0][i]+D[i][(int)pow(2,vexnum-1)-1-(int)pow(2,vexnum-i-1)] < min)
{
tag = i;
min = admatrix[0][i]+D[i][(int)pow(2,vexnum-1)-1-(int)pow(2,vexnum-i-1)];
}
}
D[0][(int)pow(2,vexnum-1)-1] = min;
path[0][(int)pow(2,vexnum-1)-1] = tag;
return min;
}
int main()
{
int **D;
char **V;
int **admatrix;
int **path;
int vexnum,i,j = 0;
Create(D,V,admatrix,path,vexnum);
cout << Solution(D,V,admatrix,path,vexnum) << endl;
char *a = (char *)malloc((vexnum+1)*sizeof(char));
cout << "经过的路径如下:" << endl;
a[j++] = 0;
int col = (int)pow(2,vexnum-1)-1;
for(i = path[0][col];i != -1;i = path[i][col])
{
col -= (int)pow(2,vexnum-i-1);
a[j++] = i;
}
a[j] = 0;
for(i = 0;i < vexnum+1;i++)
cout << a[i]+1 << " ";
cout << endl;
for(i = 0;i < vexnum;i++)
{
free(D[i]);
free(admatrix[i]);
free(path[i]);
}
for(i = 0;i < pow(2,vexnum-1);i++)
free(V[i]);
free(V);
free(D);
free(admatrix);
free(path);
free(a);
return 0;
}