关闭

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

标签: 数据结构贪心算法
41人阅读 评论(0) 收藏 举报
分类:
这是上一篇文章的代码 很拙劣的代码
#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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:656次
    • 积分:120
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档