来源:http://poj.org/problem?id=2421
题意:还是给你n个点,然后求最小生成树。特殊之处在于有一些点之间已经连上了边。
思路:对于已经有边的点,特殊标记一下,加边的时候把这些边的权值赋值为0即可。这样就可以既保证这些边一定存在,又保证了所求的结果正确。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <climits>
using namespace std;
#define CLR(arr,val) memset(arr,val,sizeof(arr))
const int N = 110;
int father[N];
struct edge{
int lp,rp,value;
}ee[N*N];
int map[N][N],flag[N][N],numedge,n;
bool cmp(edge a,edge b){
return a.value < b.value;
}
int find(int x){
if(x == father[x])
return father[x];
return find(father[x]);
}
bool Union_Set(int x,int y){
int fx = find(x);
int fy = find(y);
if(fx == fy){
return false;
}
else{
father[fx] = fy;
return true;
}
}
int kruskal(){
sort(ee,ee+numedge,cmp);
for(int i = 1; i <= n; ++i)
father[i] = i;
int sum = 0;
for(int i = 0; i < numedge; ++i){
int lx = ee[i].lp;
int rx = ee[i].rp;
if(Union_Set(lx,rx)){
sum += ee[i].value;
}
}
return sum;
}
int main(){
//freopen("1.txt","r",stdin);
while(scanf("%d",&n) != EOF){
CLR(flag,0);
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j)
scanf("%d",&map[i][j]);
}
int m,x,y;
scanf("%d",&m);
while(m--){
scanf("%d%d",&x,&y);
flag[x][y] = 1;
}
numedge = 0;
for(int i = 1; i < n; ++i){
for(int j = i + 1; j <= n; ++j){
if(flag[i][j]){
ee[numedge].lp = i;
ee[numedge].rp = j;
ee[numedge].value = 0;
numedge++;
}
else{
ee[numedge].lp = i;
ee[numedge].rp = j;
ee[numedge].value = map[i][j];
numedge++;
}
}
}
int ans = kruskal();
printf("%d\n",ans);
}
return 0;
}
更多详细信息请查看
java教程网 http://www.itchm.com/forum-59-1.html
分享到:
相关推荐
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...
标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...
标题中的“POJ 1789 最小生成树之prim算法”指的是一个在线编程竞赛题目,来源于普林斯顿开放在线课程(POJ)平台。该题目要求参赛者实现Prim算法,这是一种解决图论问题中寻找最小生成树的经典算法。最小生成树是在...
标题“POJ1724-ROADS”指的是北京大学在线编程平台POJ上的一道题目,编号为1724,题目内容与道路建设或规划有关。解题报告和AC(Accepted)代码是该问题已经成功解决的证明,通常包括对问题的理解、算法设计、代码...
### 最小生成树(MST)问题详解 #### 一、最小生成树概念 最小生成树(Minimum Spanning Tree, MST)问题是计算机科学与图论领域中的一个重要问题,尤其是在网络设计、电路板布线等领域有着广泛的应用。对于一个连通的...
1. POJ2485 和 POJ1258 题目都是典型的最小生成树问题,要求在给定的城市或农场之间构建网络,使得总距离最小。这两种情况都可以使用 Prim 算法或 Kruskal 算法来解决。Prim 算法从一个顶点开始,逐步添加边,每次...
标题中的"POJ1724-ROADS"是一个经典的编程竞赛题目,源自1998年CEOI(国际信息学奥林匹克竞赛)的第二轮。这个题目在编程竞赛圈子内广为流传,常被用于训练参赛者的算法和数据结构技能。POJ(Programming Online ...
poj 2749 Building roads.md
### 度限制最小生成树(Degree-Limited Minimum Spanning Tree)源码解析 #### 引言 在图论中,最小生成树问题是一类经典的优化问题,旨在寻找一个无向加权图中使得所有顶点相连且总边权最小的树。然而,在实际...
题目来自POJ平台,编号为1639,题目名称为“Picnic Planning”,主要考查的是算法中的最小度限制生成树问题。 ### 问题定义 给定一个无向图,其中包含一个特殊节点s(称为公园),要求构建一个生成树,使得该生成树...
先利用prim算法求出最小生成树,然后通过往MST里加边来判断新生成的最小生成树是否具有最小的权值,POJ上The Unique MST(1679)题是要求判断最小生成树是否唯一,此题其实根本不用这样做,但是为了练习球次小生成树...
标题中的"POJ3411-Paid Roads【class】"指的是一个编程竞赛问题,源自北京大学的在线评测系统POJ(Problem Online Judge)。这个题目可能涉及到道路付费的问题,需要通过编程来解决。"class"在这里可能指的是在解决...
在【压缩包子文件的文件名称列表】中,"poj 2485 Highways (最小生成树)"可能是题目提供的样例输入和输出文件,用于检验自己编写的程序是否正确。这些样例通常包含了各种边界情况和特殊案例,以确保算法的鲁棒性。 ...
poj2516代码最小费用最大流
对于POJ第1861题,参赛者可能需要读取输入数据,构建一个加权图,然后应用Prim或Kruskal算法找出最小生成树,最后输出树中边的权重总和或者某种特定格式的树结构。解题过程可能涉及到错误处理、边界条件检查以及效率...
【标题】"POJ 1861 Network"是一个经典的计算机科学问题,它涉及到图论中的网络连接,并要求我们利用并查集(Disjoint Set)数据结构来检测图中的环路,同时应用快速排序算法来求解最小生成树。这个问题在ACM(国际...
3. **P1679(Unique_MST_prim).cpp 和 P1679(Unique_MST_kruskal).cpp** - 这两个文件都涉及了“唯一最小生成树”问题。Prim和Kruskal是两种常见的求解最小生成树的算法。在某些情况下,图可能有唯一的最小生成树...
#### 2421 *Constructing Roads - 最小生成树 - **知识点**:最小生成树算法。 #### 2446 Chessboard - 二分匹配 - **知识点**:二分匹配算法。 #### 2455 Secret Milking Machine - 网络流 - **知识点**:网络...
### 最小生成树基本概念 最小生成树(Minimum Spanning Tree, MST)是图论中的一个经典问题。在一个加权的无向图中,如果能找到一个子图,它包含原图的所有顶点,并且所有顶点都通过边互相连接,但没有任何回路存在...
2. 每次迭代:在未加入到最小生成树的顶点中,找到与已加入顶点相连的边中权值最小的一条,将这条边的另一端顶点加入到最小生成树中。 3. 重复步骤2,直到所有顶点都加入到最小生成树中,或者没有未加入顶点的边。 ...