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

原创 2015年11月20日 17:37:29
这是上一篇文章的代码 很拙劣的代码
#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;
             }
         }
     }**/


}



Matalab代码 实现 Dijkstra求 有向图及无向图之间,任意两点之间的最短路径

算法思路稍后附上源代码%% Dijkstra function minWeightMatrix=shortestPath(G,nodeNum) minWeightMatrix=zeros(node...

判断无向图是否有环的C程序实现代码

//主要思路是将度小于2的顶点删除,并将与之相连的顶点度减一,如果存在无法删除的定点,则有环 #include #include #include //该结构体用来表示从某个...
  • sjjbupt
  • sjjbupt
  • 2011年08月30日 17:16
  • 1202

无向图的最小生成树算法的C程序实现代码(Prim算法)

#include #include #include //该结构体用来表示从某个顶点可以到达的其他顶点 struct ENode {     int secPoint;//顶...
  • sjjbupt
  • sjjbupt
  • 2011年08月30日 15:42
  • 3701

贪心算法解决数列作为顶点度数构造无向图问题

问题描述: Given a list of n natural numbers d 1 , d 2,...,dn, show how to decide in polynomial ...

贪心算法_无向图最小生成树*

/*贪心算法_无向图最小生成树*/ #include #include #include using namespace std; int main() { int N, M; ...

贪心法是实现代码

  • 2014年06月21日 10:23
  • 92KB
  • 下载

无向图的计算代码

  • 2013年06月08日 18:48
  • 37KB
  • 下载

基于矩阵合同变换算法的无向图同构识别——C++代码实现

基于矩阵合同变换算法的图同构识别,对有向图和无向图都适用,这个算法主要是数学方法。在线性代数这门课中有讲到矩阵的初等变换,而我的想法正是基于对矩阵初等变换的掌握。该算法主要通过判断图同构的充要条件,然...

C++无向图代码

  • 2014年01月11日 20:21
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:贪心法实现无向图的划分 代码
举报原因:
原因补充:

(最多只允许输入30个字)