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

原创 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;
             }
         }
     }**/


}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

求无向图的关节点算法

求无向的图的关节点的这个算法是我觉得比较难理解的算法之一,我觉得难并不是难在算法本身,而是难在该算法的递归的实现上,特别是在DFSArticul()递归退出以后才可以进行low[]函数的计算,这点,如...

算法-计算无向图中两个节点之间所有的路径

图论--寻找节点间所有路径        最近在论文中,要获得节点间的路由,由此又开始继续去年的算法学习。下面的就关于寻找两个节点之间所有的路径。因为是在获得路径后,再加上权重,所以不能将那些求最短路...

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

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

贪心法实现无向图的划分

给定一个无向图,使用贪心算法划分其节点,希望集合数目越来越少。矛盾:贪心算法总是局部最优,对于整个问题的求解不一定是最优的。想法:使用韦尔奇鲍威尔算法来求解该问题。鲍威尔算法:把图的节点按度的降序排列...

图(有向图、无向图)

一、图的概念 1 .图的定义 图 1.3-1所示的 ⑴, ⑵, ⑶均为图 (Graph),它有若干个不同的点 v 1, v 2, …, v n,在其中一些点之间用直线或曲线连接。图中的这些点被称为...

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

#include #include #include //该结构体用来表示从某个顶点可以到达的其他顶点 struct ENode {     int secPoint;//顶...

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

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

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

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

贪心法是实现代码

  • 2014-06-21 10:23
  • 92KB
  • 下载

无向图的计算代码

  • 2013-06-08 18:48
  • 37KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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