#include<iostream>
using namespace std;
#define maxvertex 6
typedef char vertextype;
typedef int weighttype;
weighttype del[maxvertex][maxvertex]={{0}};
typedef struct
{
weighttype matrix[maxvertex][maxvertex];//存储图中各顶点间边的权重值的二维数组
vertextype vertype[maxvertex];//存储图中顶点信息的一维数组
int vertex; //图中的顶点数
}Adjmatrix;
void creategraph(Adjmatrix *G,vertextype v[],weighttype w[][maxvertex],int n)
{
int i,j;
G->vertex=n;
for(i=0;i<n;i++)
{
G->vertype[i]=v[i];
for(j=0;j<n;j++)
{
G->matrix[i][j]=w[i][j];
}
}
}
void tree(Adjmatrix * G)
{
int i=0,j=0;
Adjmatrix *R,u;
R=&u;
R->vertex=G->vertex;
for(i=0;i<R->vertex;i++)
{
R->vertype[i]=G->vertype[i];
for(j=0;j<R->vertex;j++)
{
R->matrix[i][j]=G->matrix[i][j];
}
}
//*******************************************************
int du[maxvertex];//存储图中顶点的度的一维数组
for(i=0;i<R->vertex;i++)
{
du[i]=0;//初始化图中各顶点的度为0
}
for(i=0;i<R->vertex;i++)
{
for(j=0;j<R->vertex;j++)
{
if(R->matrix[i][j]!=0)
du[i]=du[i]+2;
}
}
//******************************************
int k=R->vertex,f=1;
while(f==1)
{
f=0;
for(i=0;i<k;i++)
{
if(du[i]<4&&R->vertype[i]!='#')
{
R->vertype[i]='#';
for(j=0;j<k;j++)
{
if(R->matrix [i][j]!=0)
{
du[j]--;
R->matrix [i][j]=0;
}
if(R->matrix [j][i]!=0)
{
R->matrix [j][i]=0;
du[j]--;
}
}
}
}
//**********************************************
int max=0,t=0,y=0;
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
if(R->matrix [i][j]>max)
{
max=R->matrix [i][j];
t=i; y=j;
}
}
}
del[t][y]=R->matrix[t][y];
R->matrix[t][y]=0; R->matrix[y][t]=0;
du[t]=du[t]-2; du[y]=du[y]-2;
for(i=0;i<k;i++)
{
if(R->vertype [i]!='#')f=1;
}
}
}
int main()
{
Adjmatrix *G,p;
G=&p;
vertextype v[6]={'A','B','C','D','E','F'};
weighttype w[6][6]={{0,6,1,5,0,0 },{6,0,5,0,3,0},{1,5,0,5,6,4},{5,0,5,0,0,2},{0,3,6,0,0,6},{0,0,4,2,6,0}};
creategraph(G,v,w,6);
tree(G);
cout<<"删除的边是:"<<endl;
for(int i=0;i<G->vertex ;i++)
{
for(int j=0;j<G->vertex;j++)
{
if(del[i][j]!=0)
cout<<G->vertype[i]<<'-'<<G->vertype[j]<<' ';
}
cout<<endl;
}
return 0;
}