这是上一篇文章的代码 很拙劣的代码
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <cstdlib>
/*2013303405 14011306 陈铭丰
使用贪心算法求解无向图顶点划分问题*/
using namespace std;
/*图的顶点定义*/
typedef struct Node //定义节点结构体
{
int index;//节点的编号
int num; //划分后集合的编号
int degree;//节点的度
} Node;
bool comDegree(Node node1,Node node2)//比较两个节点的度 按降序排列
{
return node1.degree>node2.degree;
}
bool comIndex(Node node1,Node node2)//比较两个节点的编号 按升序排列
{
return node1.index<node2.index;
}
int main()
{
int numofNode;//顶点的数目
string arrow;//邻接矩阵的行
char map[10][10];//邻接矩阵存储图
Node nodes[10];//
cout<<"请输入无向图节点的个数:"<<endl;
cin>>numofNode;
cout<<"假设一共5个点,以第一个点为例"<<endl;
cout<<"0代表不连接,1代表连接"<<endl;
cout<<"01011表示与第2、4、5点相连"<<endl;
for(int i=1; i<numofNode+1; i++)//按行存储临阶矩阵
{
cout<<"请输入与第"<<i<<"个节点连接的节点:"<<endl;
cin>>arrow;
for(int j=0; j<numofNode; j++)
{
map[i-1][j]=arrow[j];
}
}
for(int i=0; i<numofNode; i++)//对节点集合初始化
{
nodes[i].index=i;
nodes[i].num=0;
for(int j=0; j<numofNode; j++)
{
if(map[i][j]=='1')
nodes[i].degree++;
}
}
sort(nodes,nodes+numofNode,comDegree);//把节点按度从大到小排列
int s=0;//s代表集合的序号
while(true)
{
s++;
int i;
for(i=0; i<numofNode; i++)
{
if(nodes[i].num==0)
{
nodes[i].num=s;
break;
}
}
if(i==numofNode)//节点遍历完毕
break;
for(int j=0; j<numofNode; j++)
{
if(nodes[j].num==0&&map[nodes[i].index][nodes[j].index]=='0'&&i!=j)//找出不和J节点相连的点
nodes[j].num=s;
}
}
sort(nodes,nodes+numofNode,comIndex);//把节点集合中点按照编号的升序排列
cout<<"需要"<<s-1<<"个集合"<<endl;
for(int i=0; i<numofNode; i++)
cout<<"节点"<<i+1<<"在第"<<nodes[i].num<<"个集合"<<endl;
system("pause");
return 0;
/** cout<<"输入的图为"<<endl;
cout<<" ";
for(int i=0; i<numofNode; i++)
{
cout<<i+1<<" ";//打印每个节点
if(i+1==numofNode)
{
cout<<endl;//打印完所有的点 换行
}
}
for(int i=0; i<numofNode; i++)
{
cout<<i+1<<" ";//每行的头节点
for(int j=0; j<numofNode; j++)
{
cout<<map[i][j]<<" ";//矩阵的各点值
if(j+1==numofNode)
{
cout<<endl;
}
}
}**/
}