贪心法实现无向图的划分 代码

这是上一篇文章的代码 很拙劣的代码
#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;
             }
         }
     }**/


}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值