一种快速拓扑聚类算法

news2024/11/24 21:05:40

使用场景,节点编号不重叠,可以缺损,确定每个节点的相互关系和最大的节点编号,对节点进行聚类。如下图所示,分三个簇,计算每个簇包含的元素。

 插入代码,暂时没有继续优化的空间

// TopologicalClustering.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <Windows.h>
#include <set>
#include <map>

using namespace std;

struct Point
{
    int x;
    int y;
    Point(int x0,int y0)
    {
        x = x0;
        y = y0;
    }
};

struct listS
{
    std::vector<listS*> ptrNeiber;
    int id;
    int value;
    bool flag = true;
};

int updataNet(listS* listCur, int minV, set<int>& vecNode)
{
    listCur->flag = false;
    for (int i = 0; i < listCur->ptrNeiber.size(); i++)
    {
        if (listCur->ptrNeiber[i]->flag)
        {
            vecNode.insert(listCur->ptrNeiber[i]->value);
            int curV = updataNet(listCur->ptrNeiber[i],minV,vecNode);
            if (curV<minV)
            {
                minV = curV;
            }
        }
    }
    return minV;
}

int main()
{
    int maxSize = 100;
    vector<Point> vecP = {Point(2,12),Point(12,5),Point(12,3),Point(12,7),Point(5,7),Point(7,8),Point(8,3),Point(3,26),Point(8,25),Point(26,11),
    Point(16,22),Point(16,4),Point(4,19),Point(22,19),Point(19,17),Point(22,17),Point(17,36),
    Point(41,14),Point(14,6),Point(41,6),Point(6,9)};

    vector<listS> listT(maxSize);
    for (int i = 0; i < maxSize; i++)
    {
        listS listInit;
        listInit.value = i;
        listInit.id = i;
        listT[i] = listInit;
    }
    set<int> initVec;
    for (int i = 0; i < vecP.size(); i++)
    {
        Point p0 = vecP[i];
        listS* listCur = &listT[p0.y];
        listT[p0.x].ptrNeiber.push_back(listCur);
        listCur = &listT[p0.x];
        listT[p0.y].ptrNeiber.push_back(listCur);
    }

    for (int i = 0; i < maxSize; i++)
    {
        if (listT[i].ptrNeiber.size()!=0)
        {
            listS* curList = &listT[i];
            set<int> vecNode;
            vecNode.insert(curList->value);
            curList->flag = false;
            int curMIn = curList->value = updataNet(curList,curList->value,vecNode);
            for (set<int>::iterator it = vecNode.begin(); it != vecNode.end(); ++it)
            {
                listT[*it].value = curMIn;
                listT[*it].flag = true;
            }
        }
    }

    map<int, vector<int>> mapCluster;
    map<int, vector<int>>::iterator mapIter;
    for (int i = 0; i < maxSize; i++)
    {
        if (listT[i].ptrNeiber.size()!=0)
        {
            mapIter = mapCluster.find(listT[i].value);
            if (mapIter!=mapCluster.end())
            {
                mapIter->second.push_back(i);
            }
            else
            {
                vector<int> vecTemp = {i};
                mapCluster.insert(std::pair<int, std::vector<int>>(listT[i].value, vecTemp));
            }
        }
    }
    for (mapIter=mapCluster.begin(); mapIter !=mapCluster.end(); ++mapIter)
    {
        cout << "簇" << mapIter->first <<":";
        for (int i = 0; i < mapIter->second.size(); i++)
        {
            cout << mapIter->second[i]<<",";
        }
        cout << endl;
    }

    std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

测试效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式软件开发面试题(一)

目录 1.用预处理指令表示一年有多少秒 2.写出float x 与“零值”比较的if语句 3.为什么说if(0x)比if(x0)好? 4.将地0x8000中存放的整形变量&#xff0c;清除bit1。 5.linux下用shell命令在当前目录下创建myfolder目录&#xff0c;并将此目录的权限设为拥有者可读写群组和…

携手共赢!润建股份与科士达达成战略合作

7月4日&#xff08;今日&#xff09;&#xff0c;润建股份有限公司&#xff08;以下简称”润建股份“&#xff09;与深圳科士达科技股份有限公司&#xff0c;在科士达光明工业园正式签署战略合作框架协议&#xff0c;双方将发挥各自领域的技术优势&#xff0c;在新能源与数字科…

Android开发之屏幕尺寸的兼容

屏幕尺寸和密度 本部分提供了具有特定屏幕配置&#xff08;由屏幕尺寸和密度定义&#xff09;的设备的相对数量数据。为了简化针对不同屏幕配置设计界面的过程&#xff0c;Android 将实际屏幕尺寸和密度的范围划分为多个区间&#xff08;如下表所示&#xff09;。 ldpi mdpitv…

MySQL之数据库引擎详解(内附面试题:InnoDB和MyISAM的联系与区别)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于MySQL数据库引擎的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. 数据库引擎是什么&#xff…

【kubernetes系列】Kubernetes之生命周期和重启策略

概述 Pod 遵循一个预定义的生命周期&#xff0c;起始于 Pending 阶段&#xff0c;如果至少 其中有一个主要容器正常启动&#xff0c;则进入 Running&#xff0c;之后取决于 Pod 中是否有容器以 失败状态结束而进入 Succeeded 或者 Failed 阶段。 在 Pod 运行期间&#xff0c;k…

(30)精准降落和悬停(IRLock)

文章目录 30.1 概述 30.2 哪里可以买到 30.3 连接到自动驾驶仪 30.4 安装到框架上 30.5 通过任务规划器进行设置 30.6 飞行和测试 30.1 概述 Copter 支持使用 IR-LOCK 传感器(IR-LOCK sensor)和声纳或激光雷达(sonar or lidar)进行精确着陆。使用该系统&#xff0c;当飞行…

畅谈RocketMQ重复消费7个根源问题

在众多关于MQ的面试八股文中有这么一道题&#xff0c;“如何保证MQ消息消费的幂等性”。 为什么需要保证幂等性呢&#xff1f;是因为消息会重复消费。 为什么消息会重复消费&#xff1f; 明明已经消费了&#xff0c;为什么消息会被再次被消费呢&#xff1f; 不同的MQ产生的…

0基础学习VR全景平台篇 第56篇:专业版功能-故事线

功能位置示意 一、本功能将用在哪里&#xff1f; 故事线功能&#xff0c;支持将多个VR视频片段&#xff0c;自由设置剧情&#xff0c;在故事中设置多个路线结局&#xff0c;实现VR视频创作新玩法。 区别传统VR视频单项输出内容&#xff0c;促使用户主动思考&#xff0c;参与剧…

windows、linux部署seata1.3.0

前提:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明Spring Cloud AlibabaSpring CloudSpring BootNacosSeata2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE2.0.31.3.0背景:seata配合nacos使用,并开启nacos,nacos使用默认的namespace,mysql5.7 s…

在Jetpack Compose中使用SurfaceView

在 Android 开发中&#xff0c;SurfaceView 是一种特殊的视图&#xff0c;它拥有自己的专用绘图表面&#xff0c;可以在后台线程中更新&#xff0c;非常适合需要频繁和快速绘制的地方&#xff0c;如游戏和视频播放。然而&#xff0c;在Jetpack Compose&#xff08;Google的新的…

dxf文件怎么转成dwg格式?分享几种简单的转换方法

将DXF文件转成DWG格式可以提高CAD文件的兼容性和功能性&#xff0c;使其更易于在不同的CAD软件之间传输和共享。如果我们需要与其他人共享CAD图纸&#xff0c;或者想要更好地利用CAD编辑软件的各种功能和工具&#xff0c;将文件转换为DWG格式会更好一些&#xff0c;那么怎么进行…

佳明手表APP开发系列02——汉字和图标的标准显示

前言 使用点阵字库的方式来汉化或者增强佳明App的显示是一种传统的方法&#xff0c;操作繁琐&#xff0c;效果也一般。笔者通过进一步的学习&#xff0c;发现佳明的MonkeyC支持一种新的方式&#xff0c;即 BmpFont文件的显示&#xff0c;可以像使用普通字符一样对包括汉字在内…

东芝光电耦合器TLP152(TPL,E的工作原理以及应用

东芝深力科TLP152(TPL,E是SO6封装中的光电耦合器&#xff0c;由GaA组成ℓ作为红外发光二极管&#xff08;LED&#xff09;光学耦合到集成的高增益、高速光电探测器IC芯片。光电探测器IC芯片具有内部屏蔽&#xff0c;提供20kV的高共模瞬态抗扰度/s&#xff0c;从而在输入和输出引…

MySQL-分库分表详解(二)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

港联证券|利好刺激创新药板块迎久违拉升 估值处历史低位

昨日&#xff0c;国家医保局就《谈判药品续约规则》及《非独家药品竞价规则》公开征求意见。在此利好消息影响下&#xff0c;创新药板块集体拉升。截至收盘&#xff0c;创新药指数涨幅近1%&#xff0c;实现四连阳。港股创新药指数收盘涨超3%。 机构认为政策利好创新药发展 《非…

Impala3.4源码阅读笔记(一)data-cache功能

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 基本信息 data-cache是impala在本地的数据缓…

解决github无法打开问题

第一步&#xff0c;去如下目录复制hosts文件副本到桌面【切记&#xff0c;要复制到其他文件夹下&#xff0c;不要直接改原文件】。 C:\Windows\System32\drivers\etc 第二步&#xff0c;以文本文档形式打开复制的副本文件&#xff0c;添加如下语句保存后【替换】掉原有hosts文件…

Ubuntu 16.04 安装Arduino ESP32开发环境记录

文章目录 安装arduino开发环境&#xff1a;安装ESP32开发环境编译上传 安装arduino开发环境&#xff1a; Arduino IDE 2.x好像对于ubuntu16.04不太支持&#xff0c;尝试了一下执行不了。这里 我们可以下载早期的1.8.x版本。 根据自己的电脑类型在红框中选择对应的版本进行下载…

CHI 控制信号说明

&#xff08;部分描述采用了他人的文章&#xff0c;待后续补充出处&#xff0c;此处为草稿&#xff09; Address PA/VA 位宽之间的对应关系&#xff1b; Non-secure bit 该bit指示了secure和non-secure空间&#xff0c;对于snoopable的trans, 即使地址相同&#xff0c;secure和…

阿里首次公布 Java10W 字面试复盘笔记,面面俱到、太全了

Java 面试 “金三银四&#xff0c;金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金三银、金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技…