首页 > 其他分享 >设计图的数据,并建立最小生成树,同时计算生成最小生成树的时间

设计图的数据,并建立最小生成树,同时计算生成最小生成树的时间

时间:2023-10-26 22:44:56浏览次数:32  
标签:std outputFile int graph 设计图 最小 生成 ++ vector

首先是建立图,呈现形式一共有三种,第一种是  有V顶点,E边,这个第一次考虑的时候,(没有设计权重)第二种是临接表的形式;第三种是临界矩阵的形式呈现,我们使用第三种邻接矩阵来记录和统计图;

以下是生成图的代码,阶数表示为20阶,可以自行修改图的阶数;

#include <iostream>
#include <vector>
#include <random>
#include <fstream>

std::vector<std::vector<int>> generateGraph(int n) {
std::vector<std::vector<int>> graph(n, std::vector<int>(n, 0));

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 100);

for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int weight = dis(gen); // 随机生成边的权重
graph[i][j] = weight;
graph[j][i] = weight;
}
}

return graph;
}

void printGraph(const std::vector<std::vector<int>>& graph) {
int n = graph.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
std::cout << graph[i][j] << " ";
}
std::cout << std::endl;
}
}

void saveGraphToFile(const std::vector<std::vector<int>>& graph) {
std::ofstream outputFile("graphT.txt");
if (outputFile.is_open()) {
int n = graph.size();
outputFile << n << std::endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
outputFile << graph[i][j] << " ";
}
outputFile << std::endl;
}
outputFile.close();
std::cout << "图已保存到 graphT.txt" << std::endl;
} else {
std::cerr << "无法打开文件 graphT.txt 进行保存" << std::endl;
}
}

int main() {
int n = 20; // 图的阶数
std::vector<std::vector<int>> graph = generateGraph(n);

printGraph(graph);

saveGraphToFile(graph);

return 0;
}

 

我们得到的txt文件是graphT,接下来是对这部分邻接矩阵进行生成最小生成树的操作,下面是生成最小生成树的代码,由于图的测试数据一直有变动,因此这里的输入文件,我们使用input 文件,需要自己重新修建一个txt文件,或者将图的邻接矩阵进行重命名;

#include <iostream>
#include <fstream>
#include <vector>
#include <chrono>
#include <climits>

void primMST(int n, std::vector<std::vector<int>>& graph) {
std::vector<bool> visited(n, false);
std::vector<int> key(n, INT_MAX);
std::vector<int> parent(n, -1);
int weight = 0; // 记录生成树的权重

key[0] = 0; // 将第一个顶点作为起始顶点

auto start = std::chrono::steady_clock::now(); // 记录开始时间

for (int count = 0; count < n - 1; count++) {
int u = -1;
for (int v = 0; v < n; v++) {
if (!visited[v] && (u == -1 || key[v] < key[u])) {
u = v;
}
}

visited[u] = true;

for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] != 0 && graph[u][v] < key[v]) {
parent[v] = u;
key[v] = graph[u][v];
}
}
}

auto end = std::chrono::steady_clock::now(); // 记录结束时间

std::ofstream outputFile("output.txt");
if (outputFile.is_open()) {
// 输出生成树的边和权重,并计算总权重
for (int i = 1; i < n; i++) {
outputFile << parent[i] << " - " << i << ": " << graph[i][parent[i]] << std::endl;
weight += graph[i][parent[i]];
}

outputFile << "最小生成树的权重为:" << weight << std::endl;
outputFile << "生成最小生成树所耗费的时间为:" << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << "微秒" << std::endl;

outputFile.close();
std::cout << "结果已保存到 output.txt" << std::endl;
} else {
std::cerr << "无法打开文件 output.txt 进行保存" << std::endl;
}
}

int main() {
std::ifstream inputFile("input.txt");
int n;
inputFile >> n;

std::vector<std::vector<int>> graph(n, std::vector<int>(n, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
inputFile >> graph[i][j];
}
}

inputFile.close();

primMST(n, graph);

return 0;
}

生成的结果我们保存在output文件中,在这个部分时,之前的代码都出现这个问题:

Process exited after 0.7779 seconds with return value 3221225477 ...

这个问题好多次出现,现在想,估计是当时的图的邻接矩阵有问题,或是放入到txt文件中时,没有加上阶数,或者是生成的时候,(i,j)和(j,i)对应的数值不一样,导致的内存问题;

 这部分是原因;下面我重新运行一下;

 好吧还是有错误......

 

找到结果啦,是由于文件名测试的时候过长,由于前缀加上去,总的就太长,所以出现那个问题;

 

标签:std,outputFile,int,graph,设计图,最小,生成,++,vector
From: https://www.cnblogs.com/yq15mm/p/17790657.html

相关文章

  • 记录--记录用前端代替后端生成zip的过程,速度快了 57 倍!!!
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助业务场景:产品有个功能是设置主题。类似手机自动切换壁纸,以及其他功能颜色,icon,字体等。管理员需要在后端管理系统多次下载不同主题,(至于要干啥就不说了...),主题中可能有30~100个高清壁纸,icon等。现在每次下......
  • 学生成绩数据分析软件,提升数据分析效率?
     学生成绩数据分析软件在教育领域中起着重要的作用,可以帮助教育机构和教师更好地理解学生的学习情况、评估教学效果,并提供决策支持。这些软件利用统计分析、数据挖掘和机器学习等技术,可以处理大量的学生成绩数据,并从中提取有价值的信息。下面将详细介绍一些常见的学生成绩数据......
  • Fingerprint2 生成浏览器指纹
    Fingerprint2是一款开源的设备指纹生成器。主要用于判断用户是否是新增用户,或者判断设备是否为新增访问设备 在html上面直接引入Fingerprint2库 <scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/fingerprintjs2/2.1.0/fingerprint2.min.js"></script>定义生成指纹......
  • vue3 vite 根据目录生成路由
    vite勾选vue-router搭建好项目后,routes部分示例代码为routes:[{path:'/',name:'home',component:HomeView},{path:'/about',name:'about',//routelevelcode-splitting......
  • pyopenssl 生成ssl证书
    fromOpenSSLimportcrypto,SSLdefgenerate_certificate( organization="PrivacyFilter", common_name="192.168.1.200:8000", country="NL", duration=(365*24*60*60), keyfilename="key.pem", certfilenam......
  • 使用vite自动生成vue路由
    全新的路由组织方式以往编写路由都需要手动编写router.js代码,其实很多代码是重复的新的方案根据文件夹目录结构自动生成文件夹下的index.vue->/初始化项目构建npminitvue@latest运行npmrundev项目结构一个文件夹对应一个路由page.js用来填写配置信息exportdefault{ti......
  • Python高效地生成#号颜色文本
    之前一直想知道如何快速通过整型变量生成颜色文本,直到问了chatgpt,下面是生成红颜色的一个实例:r=255g=0b=0color='#%02x%02x%02x'%(r,g,b)展示颜色的实例程序:fromtkinterimport*r=Tk()c=Canvas(r)c.pack(fill=BOTH,expand=True)b=Button(r,......
  • Java 求两个数的最大公约数和最小公倍数(理解原理 > 背诵)
    解题需知原理,背诵来的知识只能支撑一时。为什么反复执行a%b,即可得到最大公约数?(设定前提是a>b)其中的数学原理就是:a和b的最大公约数完全等同于 b和a%b的最大公约数,证明在这里:辗转相除法求解最大公约数和最小公倍数的数学原理-知乎求得最大公约数d以后,比方说:a=x*......
  • 地形生成Mesh
    地形例如栅格,可以生成mesh(三角网)。方法如下:每个栅格有四个顶点。四个顶点各生成一个高程。栅格中心点也生成一个高程。那么一个栅格就生成了4个三角形?这不就是mesh吗?一个生成四个,四个生成16个。地形tile的mesh化看来可以无限的细化?cesium的.terrain文件好像就是mesh三角......
  • pyspark.sql处理多分隔符数据文件生成DF案例
    pyspark程序清洗多分隔符数据案例原始数据可以看到原始数据是以“|#$”多分隔符进行数据分割的POD9_6ec8794bd3297048d6ef7b6dff7b8be1|#$2023-10-24|#$0833|#$#|#$#|#$99999999999|#$#|#$12345678912POD9_352858578708f144bb166a77bad743f4|#$2023-10-24|#$0391|#$#|#$#|#$99......