引水工程 Kruskal + Prim
Kruskal题解 : 以案例输入为例 有五个缺水地区 , 这个个缺水地区之间建立联系的费用已经给出 并且之间水库的费用也已经给出 , 自己水库也已看为 是另一个 点 , 这样就有了 6 个点 , 这六个点彼此之间可以建立联系 , 总共形成 5 条边 , 将这 6 个点连接起来 , 这样就符合了题意 , 也可以更好的 用Kruskal 解决 这一个问题 , 我们可以让 这五个点 建立一个 到 0 的 距离关系 , 这样就有 0 - 6 六个点了 , 下面附上 实现代码
从水库和各个点之间的通道是单向的 ,
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<limits.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std;
int n,m,minn,father[],sum,tem[];
struct node
{
int x,y,l;
}a[];
bool cmp(node a,node b)
{
return a.l<b.l;
}
int find(int x) // 做了时间上的优化 ,但是 在空间复杂度上比较高
{
if(x!=father[x])
father[x]=find(father[x]);
sum++;
return father[x];
}
bool merge(int x,int y) // 做了时间复杂度上的优化 让并查集的 深度尽量 浅
{
int sum1,sum2;
sum=;
x=find(x);
sum1=sum; // x 的深度
sum=;
y=find(y);
sum2=sum; // y 的深度
if(x!=y)
{
if(sum1>sum2)
father[y]=x;
else
father[x]=y;
return true;
}
else
return false;
}
int main() // 先用 Dijkstra 做一次 // Dijkstra 是 根据边来做的
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
father[i]=i;
int q=;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
int e;
scanf("%d",&e);
a[q].x=j;
a[q].y=i;
a[q].l=e;
q++;
}
}
int m=n*n,sum3=,count1=;
sort(a,a+q,cmp);
for(int i=;i<q;i++)
{
if(merge(a[i].x,a[i].y))
{
sum3+=a[i].l;
count1++;
}
if(count1==n) // 如果边数等于 所有需要连接的 点数-1的话 就跳出去
break;
}
printf("%d\n",sum3);
}
return ;
}
Prim 题解 : Prim 是根据 点之间的关系 去 构成最小生成树的 , 做题的思路和上面 Kruskal 处理之间水库一样 下面附上实现代码 .
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<limits.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
using namespace std;
int a[][],visited[],dis[];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
dis[i]=INT_MAX;
for(int j=;j<=n;j++)
{
a[i][j]=INT_MAX;
}
}
memset(visited,,sizeof(visited));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&a[i][j]); //
if(i==)
a[j][i]=a[i][j]; // OK !
}
}
int n1=n,minn,j,b=,sum=;
visited[]=; //从水库开始吧
while(n1--) // 一共 n+1 个点 需要 n 个边
{
minn=INT_MAX;
for(int i=;i<=n;i++)
{
if(b!=i&&a[b][i]<dis[i]&&!visited[i]) // visited 控制 是否成环
{
dis[i]=a[b][i]; // 如果不是自己到自己 并且 现在该点到 以前该点比已经确定的集合的距离短的话 ,那么就刷新距离
}
}
for(int i=;i<=n;i++)
{
if(minn>dis[i]&&!visited[i])
{
minn=dis[i];
j=i;
}
}
visited[j]=;
b=j;
sum+=minn;
}
printf("%d\n",sum);
}
return ;
}
引水工程 Kruskal + Prim的更多相关文章
- nyoj 1239——引水工程——————【最小生成树 prim】
引水工程 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工 ...
- zufe oj 引水工程( 巧妙地把在i建水设为e[0][i])
引水工程 时间限制: 3 Sec 内存限制: 128 MB提交: 11 解决: 6[提交][状态][讨论版] 题目描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来 ...
- 第八届河南省赛D.引水工程(kruthcra+prime)
D.引水工程 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 118 Solved: 41 [Submit][Status][Web Board] D ...
- Nyoj 引水工程(最小生成树)
描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事关中华民族长远发展.“南水北调工程”,旨在缓解中国华北和西北地区水资源短缺的国家 ...
- 河南省第八届ACM省赛---引水工程
引水工程 时间限制:2000 ms | 内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...
- zzuoj 10409 10409: D.引水工程
10409: D.引水工程 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 96 Solved: 34[Submit][Status][Web Boar ...
- HDU.1233 还是畅通工程(Prim)
HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...
- POJ-2421Constructing Roads,又是最小生成树,和第八届河南省赛的引水工程惊人的相似,并查集与最小生成树的灵活与能用,水过~~~
Constructing Roads Time Limit: 2000MS Memory Limit: 65536K Description There are N v ...
- 还是畅通工程(prim和kruskal)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- python3 时间模块 random模块之两个小练习
话不多说,一个是算时间的,还有一个是生成验证码的 #!usr/bin/env/ python # -*- coding:utf-8 -*- # Author: XiaoFeng import time ...
- 搭建Nginx服务
Nginx 是一个高性能的 http 和反向代理服务器,也是一个 IMAP/POP3/SMPT 服务器. Nginx 是由 logor Sysoev 为俄罗斯访问第二的 Ranbler.ru 站点开发 ...
- 洛谷 1821 [USACO07FEB]银牛派对Silver Cow Party
[题解] 其实解法 #include<cstdio> #include<cstring> #include<algorithm> #define LL long l ...
- 洛谷 2471 BZOJ 1067 [SCOI2007]降雨量
[题解] 用线段树维护区间最大值(因为没有修改,St表也可以),然后由于x,y可能是降雨量未知的年份,需要进行分类讨论. #include<cstdio> #include<algo ...
- 【04】AngularJS 表达式
AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. Ang ...
- mongo实践-透过js shell操作mongo
mongo实践-通过js shell操作mongo 保存命令: j={name:"wangjingjing",age:15} db.user.save(j); 查询命令: var ...
- [luoguP1403] [AHOI2005]约数研究(这。。。)
传送门 用类似筛法的原理,就好啦 ——代码 #include <cstdio> int n, ans; int a[1000001]; int main() { int i, j; sca ...
- node.js 利用流实现读写同步,边读边写
//10个数 10个字节,每次读4b,写1b let fs=require("fs"); function pipe(source,target) { //先创建可读流,再创建可写 ...
- windows下如何正确使用Jconsole远程连接linux主机上的JVM
https://www.aliyun.com/jiaocheng/589230.html
- MYSQL中有关数据库的简单操作
#创建数据库CREATE DATABASE day01; #查询所有数据库SHOW DATABASES; #查看某个数据库定义信息SHOW CREATE DATABASE day01; #查询正在使用 ...