新疆大学(新大)OJ xju 1009: 一带一路 prim求最短路径+O(n)素数筛选
1009: 一带一路
时间限制: 1 Sec 内存限制: 128 MB
题目描述
一带一路是去去年习大大提出来的建设“新丝绸之路经济带”和“21世纪海上丝绸之路”的战略构想。其中就包括我们新疆乌鲁木齐,所以这也是对新疆来说是一个巨大的机遇。我们新疆要加强和周边国家的经济文化交流,就必然要和周边国家城市修许多路。现在假设有N座城市,每一个城市都有一个投资指标数,例如A城市和B城市的投资指标数分别为Ia和Ib,如果Ia或Ib或Ia-Ib的绝对值为素数或者为1,则A城市和B城市可以修路,否则不能。他们修路的花费为Ia,Ib,Ia-Ib的绝对值这三个数中的最小值,并且为素数或者1。现在已知所以城市之间的投资指标,假设他们直接原来没有任何路,要求你在其中修路联通这些城市(即任何两座城市之间都能直接或者间接的有路相通)。求修这些路最少花费总和。
输入
输入包含多组数据,第一行为测试数据T组(1<=T<=10);以下每组数据第一行包含城市的个数N(1<N<=100),接下来一行表示N个整数表示每个城市的投资指标数I(I为正整数,1<=I<=1000000)
输出
输出最小花费总和,如果无法使所以城市连通,则输出-1
样例输入
2
5
1 2 3 4 5
4
4 4 4 4
样例输出
Case 1: 4
Case 2: -1 题目链接:https://acm.xju.edu.cn/JudgeOnline/problem.php?id=1009 数据量1000000的素数,比较大,一个一个算肯定超时,所以我用了小红书上O(n)的素数筛选法。
然后最小生成树有两种求法,第一种是Prim算法,第二种是Kruskal算法。
时间复杂度都是O(|E|log|V|)。 第一种用邻接矩阵,第二种用邻接表。
这里数据量比较小,直接用Prim算法。 懒得自己打就抄个模板就好了。 两个模板O(n)的素数筛选和Prim求最小生成树。 代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std; int a[]; int s[][]; //邻接矩阵 //O(n)的素数筛选,见小红书算法与实现
int ans[]; //按顺序记录素数
bool valid[]; // valid[i] == true 表示 i是素数
int tot = ; //素数的个数
void getPrime(int n){
memset(valid,true,sizeof(valid)); for(int i = ;i <= n; i++){
if(valid[i]){
tot++;ans[tot] = i;
}
for(int j = ;((j <= tot)&&(i*ans[j] <= n)); j++){
valid[i*ans[j]] = false;
if(i&ans[j] == ) break;
}
}
} int mincost[]; //记录从源点0到点i的最小花费
bool used[]; // 记录i点是否使用过 int prim(int n){
for(int i = ;i < n; i++){
mincost[i] = 2e9;
used[i] = false;
}
mincost[] = ;
int res = ;
while(true){
int v = -;
for(int u = ;u < n; u++){
if(!used[u] && (v == - || mincost[u] < mincost[v])) v = u;
}
if(v == -||mincost[v] == 2e9) break;
used[v] = true;
res += mincost[v];
for(int u = ;u < n; u++){
mincost[u] = min(mincost[u],s[v][u]);
}
}
//判断是否有点没有用过,即不能产生最小生成树
int flag = ;
for(int i = ;i < n; i++){
if(!used[i]){
flag = ;
break;
}
}
if(flag) return -;
if(res <= ) return -;
return res;
} int main() { //O(n)的素数筛选
getPrime();
int t,n;
cin >> t; int num = ; while(t--){
for(int i = ;i < ; i++){
for(int j = ;j < ; j++){
s[i][j] = 2e9;
}
}
cin >> n;
for(int i = ;i < n; i++){
cin >> a[i];
}
for(int i = ;i < n; i++){
for(int j = i+;j < n; j++){ //找到3个数中最小的素数
int p = abs(a[i]-a[j]);
int d[] = {p,a[i],a[j]};
sort(d,d+);
for(int k = ;k < ; k++){
if(valid[d[k]]){
//如果为素数则跳出,此时是最小的素数
s[i][j] = d[k];
s[j][i] = d[k];
break;
}
}
//没有素数,即不产生一条边
if(s[i][j] == ) s[i][j] = 2e9;
}
} cout << "Case " << ++num << ": ";
cout << prim(n) << endl;
} return ;
}
新疆大学(新大)OJ xju 1009: 一带一路 prim求最短路径+O(n)素数筛选的更多相关文章
- 西南民大oj(两园交求面积)
西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3 ...
- 各大Oj平台介绍 刷题平台
https://leetcode.com/ http://www.cnblogs.com/lzmfywz/archive/2012/02/07/2342010.html 1.题库与网站资源题库-在线提 ...
- 各大Oj平台介绍
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
- 蓝桥杯练习-各大OJ平台介绍
校赛准备的不够充分,简单题失分太遗憾, 有幸参加到省赛,这次先码一下练习平台,等学期结束忙完之后好好练习! 1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的 ...
- prim求MST
PRIM==>>MST模板 #include <iostream> using namespace std; #define typec int #define V 3 con ...
- LightOJ 1197 LightOJ 1197(大区间素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1197 题目大意: 就是给你一个区间[a,b]让你求这个区间素数的个数 但a.b的值太大没法直接进 ...
- 新疆大学(新大)OJ xju 1010: 四个年级 C++ STL map 将4层循环优化成2层循环可解
1010: 四个年级 时间限制: 3 Sec 内存限制: 128 MB 题目描述 为了加强全体软件学院的同学的较量,学院想让ACM协会设计一次活动让所以软件学院的同学都加入,并且要实现高年级和低年级 ...
- 新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘
题目链接:http://acm.xju.edu.cn/JudgeOnline/problem.php?id=1006 第二类斯特林数: 第二类Stirling数实际上是集合的一个拆分,表示将n个不同的 ...
- 各大Oj平台介绍[转]
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
随机推荐
- BZOJ 2287 DP+容斥
思路: 先处理出来f[j]表示这i个物品都可用 填满容量j的方案数 容斥一发 处理出来g[j]=g[j-w[i]] 表示i不能用的时候 填满容量j的方案数 //By SiriusRen #includ ...
- HDU 1052 Tian Ji -- The Horse Racing【贪心在动态规划中的运用】
算法分析: 这个问题很显然可以转化成一个二分图最佳匹配的问题.把田忌的马放左边,把齐王的马放右边.田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边:如果平局,则连一条权为0的边:如果输 ...
- ZBrush中如何清除遮罩
在之前的学习中我们知道在ZBrush®中如何创建遮罩,在创建遮罩时怎样进行反转来选择反选遮罩,本文将详细讲解ZBrush中如何清除遮罩,当我们利用遮罩达到预期效果时就需要将遮罩清除了:或者在做了遮罩的 ...
- 注解实战aftersuite和beforesuite
package com.course.testng;import org.testng.annotations.*; public class BasicAnnotation { //最基本的注解,用 ...
- CentOS安装记录
决定开始复习Linux系统编程,这次我不再折腾Linux下的各种工具,直接使用VS2017进行代码编写与调试. 配置项 值 VM VMware® Workstation 15 Pro OS CentO ...
- JS[获取两个日期中所有的月份]
//------[获取两个日期中所有的月份中] function getMonthBetween(start,end){ var result = []; var s = start.split(&q ...
- pytorch 6 build_nn_quickly 快速搭建神经网络
import torch import torch.nn.functional as F # replace following class code with an easy sequential ...
- 使用剩余参数代替 arguments (prefer-rest-params)
使用剩余参数代替 arguments (prefer-rest-params) 剩余参数来自于ES2016.可以在可变函数中使用这个特性来替代arguments变量. arguments没有Array ...
- Java基础学习总结(57)——Jrebel插件热部署
JavaEE开发环境下,Tomcat对热布署的支持还是比较弱,致使开发过程中浪费大量时间在重启服务上.胖先生讨厌来来回回的折腾,所以想看看有没有实时的编译,发现Jrebel的插件付费软件,它对热布署的 ...
- jvm 虚拟机参数_堆内存分配
1.参数 -XX:+PrintGC 只要遇到 GC 就会打印日志 -XX:+UseSerialGC 配置串行回收器 -XX:+PrintGCDetails 查看详细信息,包括各个区的情况 -XX:+P ...