来源: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
分享到:
相关推荐
#### 2421 *Constructing Roads - 最小生成树 - **知识点**:最小生成树算法。 #### 2446 Chessboard - 二分匹配 - **知识点**:二分匹配算法。 #### 2455 Secret Milking Machine - 网络流 - **知识点**:网络...
例如,题目中的"1102 Constructing Roads"、"1232 畅通工程"、"1233 还是畅通工程"等都涉及到了最小生成树的求解。在解决这类问题时,你需要理解如何有效地构建最小生成树,避免形成环路,并考虑在有特殊情况(如边...
少儿编程scratch项目源代码文件案例素材-直升机飞行.zip
wanjunshe_Python-Tensorflow_12888_1745868924470
健康监测_Android开发_BLE蓝牙通信_心率数据采集与存储_基于小米手环2的实时心率监测应用_支持后台长时间运行的心率记录工具_可导出SQLite数据库的心率数据分析系统_适
少儿编程scratch项目源代码文件案例素材-种花模拟器.zip
嵌入式系统开发_FreeRTOS实时操作系统_STM32F103C8T6微控制器_OLED显示屏_DHT11温湿度传感器_多任务调度_多级菜单设计_万年历算法_电子闹钟功能_参数配
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
scratch少儿编程逻辑思维游戏源码-猫猫粉碎.zip
scratch少儿编程逻辑思维游戏源码-蓝胡子.zip
scratch少儿编程逻辑思维游戏源码-美食大亨.zip
scratch少儿编程逻辑思维游戏源码-洛克人.zip
scratch少儿编程逻辑思维游戏源码-龙冲刺.zip
思幻个人引导页V2.2版本11月29日更新.zip
scratch少儿编程逻辑思维游戏源码-骑士风斩法.zip
移动应用开发_H5CSS3ionicng-cordovaMVVM模式_基于HTML5和CSS3技术实现多页面布局ionic指令数据绑定ui-route单页跳转调用手机
少儿编程scratch项目源代码文件案例素材-植物大战僵尸创造版 Ver. 1.0.3.zip
scratch少儿编程逻辑思维游戏源码-日落(2).zip
动态星空背景个人主页(带后台).zip
scratch少儿编程逻辑思维游戏源码-迷雾森林:诞生 3.2 起源觉醒.zip