题目地址:http://judge.u-aizu.ac.jp/onlinejudge/contest/ICPCOOC2014/F.pdf
大致题意:
求出一个带权无向图中哪些边一定是最小生成树的一部分,输出这边的数量和他们权值的和。
大致思路:
先求一遍prim,记录哪些边在这个最小生成树上。然后依次枚举删去这些边,如果删掉第i条边之后最小生成树长度增加,则第i条边一定在最小生成树上。
附上这辈子写过的最丑的代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int nMax=1000; const int mMax=100010; const int inf=1000010; int n,m,map[nMax][nMax],mark[mMax],mpp[nMax][nMax]; int dis[nMax],fff[nMax],ans,mintree[nMax][2],nk; int prim(bool isis){ // 自己的prim模板。 int i, j, now,aaa,bbb; int min_node, min_edge; for(i = 1; i <=n; i ++) dis[i] = inf-10; now = 1; ans = 0; nk=1; for(i = 0; i < n-1; i ++){ dis[now] = -1; // 将dis[]的值赋-1,表示已经加入生成树中。 min_edge = inf; for(j = 1; j <= n; j ++) // 更新每个顶点所对应的dis[]值。 if(now != j && dis[j] >= 0 ){ if(map[now][j]<dis[j]){ dis[j]=map[now][j]; fff[j]=now; } if(dis[j] < min_edge){ min_edge = dis[j]; min_node = j; } } now = min_node; if(isis==1){ aaa=now; bbb=fff[now]; mintree[nk][0]=aaa; mintree[nk++][1]=bbb; } ans += min_edge; } return ans; } int val[mMax]; int main(){ int i,j,a,b,c; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++)for(j=1;j<=n;j++)map[i][j]=inf; memset(mark,0,sizeof(mark)); for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; mpp[a][b]=mpp[b][a]=i; val[i]=c; } int sum = prim(1); a=map[mintree[1][0]][mintree[1][1]]; map[mintree[1][0]][mintree[1][1]]=map[mintree[1][1]][mintree[1][0]]=inf; if(sum!=prim(0)){ mark[mpp[mintree[1][0]][mintree[1][1]]]=1; } for(i=2;i<=n-1;i++){ map[mintree[i-1][0]][mintree[i-1][1]]=map[mintree[i-1][1]][mintree[i-1][0]]=a; if(mark[mpp[mintree[i][0]][mintree[i][1]]])continue; a=map[mintree[i][0]][mintree[i][1]]; map[mintree[i][0]][mintree[i][1]]=map[mintree[i][1]][mintree[i][0]]=inf; b=prim(0); // cout<<b<<endl; if(sum!=b){ mark[mpp[mintree[i][0]][mintree[i][1]]]=1; } } ans=0,sum=0; for(i=1;i<=m;i++){ if(mark[i]){ ans++; sum+=val[i]; } } printf("%d %d\n",ans,sum); } return 0; }
相关推荐
Prim 算法求最小生成树 语法:prim(Graph G,int vcount,int father[]); 参数: G:图,用邻接矩阵表示 vcount:表示图的顶点个数 father[]:用来记录每个节点的父节点 返回值:null 注意: 常数max_vertexes 为图...
根据给定的文件信息,本篇内容将围绕“数据结构实验报告9-图-Prim算法求最小生成树”展开,具体涉及的知识点包括Prim算法的基本原理及其应用、图的邻接矩阵存储结构的设计与实现、最小生成树的概念及求解过程、以及...
### 实现Prim算法的C++源代码解析与知识点详解 #### Prim算法简介 Prim算法是一种用于寻找图中最小生成树(Minimum Spanning Tree, MST)的贪心算法。最小生成树是指在一个连通、无向的加权图中,通过选择部分边...
在这个问题中,Prim算法和Kruskal算法是两种常用的方法。 1. Prim算法: Prim算法是一种贪心策略,它从一个起始顶点开始,逐步添加边,每次添加一条与已选择顶点集形成最小权重边的新边。这个过程不断进行,直到...
Prim算法是一种有效的解决最小生成树问题的方法,它由Robert C. Prim在1930年代提出,主要用于寻找加权无向图中的最小生成树。在这个程序中,我们将深入探讨Prim算法的原理、C++实现以及如何通过它来找到一个图的...
Prim编程语言基于。 由于我一直将术语缩写为“Prim R”,因此向似乎是合理的,他的工作几乎完全无关。 警告 不要用这个。 该建议将来可能会发生变化,但此时要使用 Prim 存在一些严重的障碍。 这段代码很旧(我不...
Prim算法是一种经典的图论算法,用于寻找加权无向图中的最小生成树。最小生成树是连接图中所有顶点的树形子图,其边的权重之和最小。这个算法由Eugene Prim在1930年提出,是解决网络设计、资源分配等实际问题的重要...
### 最小生成树与Prim算法(邻接矩阵实现) #### 一、最小生成树概念 在图论中,一个无向图的生成树是该图的一个无环子图,且包含图中的所有顶点。若该图是有权图,则生成树上的边也带有相应的权重。最小生成树...
primMST 方法:实现 Prim 算法来计算最小生成树。 g.graph:输入的图的邻接矩阵。 g.primMST():调用 primMST 方法以计算最小生成树。 使用方法: 将上述代码保存为 minimum_spanning_tree.py。 运行 Python 文件: ...
### 邻接表Prim算法知识点解析 #### 一、Prim算法概述 Prim算法是一种用于寻找加权无向图中的最小生成树(Minimum Spanning Tree, MST)的算法。所谓最小生成树,是指在一个连通的加权无向图中找到一棵包含所有顶点...
Prim算法是一种在图论中用于寻找最小生成树的著名算法,由捷克数学家Vojtěch Jarník于1930年提出,后来由美国计算机科学家Robert C. Prim在1957年独立发现,因此被称为Prim算法。最小生成树问题是在一个加权无向图...
标题中的"POJ2485-Highways【Prim】"指的是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problemset Online Judge)。这个题目要求使用Prim算法来解决,Prim算法是一种在图论中寻找最小生成树的经典算法。 ...
C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim习题答案影印版本C++ Prim...
Prim算法是解决这个问题的一种有效方法,由捷克数学家Vojtěch Jarník在1930年提出,后来被美国计算机科学家Robert C. Prim改进并推广。 Prim算法的核心思想是贪心策略,每次从当前已构建的树中选择一条与未加入树...
PRIM算法,也称为普里姆算法,是图论中的一种经典算法,主要用于寻找加权无向图中的最小生成树。最小生成树是一棵树形结构,包含了原图的所有顶点,且边的权重之和最小。这个算法由捷克数学家Vojtěch Jarník在1930...
Prim算法是一种在图论中用于找到加权无向图的最小生成树的算法。最小生成树是连接所有图中顶点的树形子图,其边的权重之和最小。这个算法是由捷克数学家Vojtěch Jarník在1930年提出,后来由美国计算机科学家Robert...
prim算法:随机Prim算法生成的迷宫岔路较多,整体上较为自然而又复杂,算法核心为(根据维基百科)。 1.让迷宫全是墙. 2.选一个单元格作为迷宫的通路(我一般选择起点),然后把它的邻墙放入列表 3.当列表里还有墙时...
Prim算法是一种经典的图论算法,主要用于寻找加权无向图中的最小生成树。这个最小生成树的概念是指在不增加边的权重的情况下,连接图中所有顶点的树形子图。Prim算法是解决这一问题的有效方法之一,尤其适用于稠密图...
Prim算法是解决这个问题的一种有效方法。在本文中,我们将深入探讨Prim算法,了解其工作原理、实现步骤以及在实际问题中的应用。 Prim算法主要用于找到一个加权无向图的最小生成树,即从图中选取一组边,使得这些...