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)素数筛选的更多相关文章

  1. 西南民大oj(两园交求面积)

    西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3 ...

  2. 各大Oj平台介绍 刷题平台

    https://leetcode.com/ http://www.cnblogs.com/lzmfywz/archive/2012/02/07/2342010.html 1.题库与网站资源题库-在线提 ...

  3. 各大Oj平台介绍

    1.题库与网站资源题库-在线提交系统(Online Judge)简介   下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...

  4. 蓝桥杯练习-各大OJ平台介绍

    校赛准备的不够充分,简单题失分太遗憾, 有幸参加到省赛,这次先码一下练习平台,等学期结束忙完之后好好练习! 1.题库与网站资源题库-在线提交系统(Online Judge)简介   下面是几个比较大的 ...

  5. prim求MST

    PRIM==>>MST模板 #include <iostream> using namespace std; #define typec int #define V 3 con ...

  6. LightOJ 1197 LightOJ 1197(大区间素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1197 题目大意: 就是给你一个区间[a,b]让你求这个区间素数的个数 但a.b的值太大没法直接进 ...

  7. 新疆大学(新大)OJ xju 1010: 四个年级 C++ STL map 将4层循环优化成2层循环可解

    1010: 四个年级 时间限制: 3 Sec  内存限制: 128 MB 题目描述 为了加强全体软件学院的同学的较量,学院想让ACM协会设计一次活动让所以软件学院的同学都加入,并且要实现高年级和低年级 ...

  8. 新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘

    题目链接:http://acm.xju.edu.cn/JudgeOnline/problem.php?id=1006 第二类斯特林数: 第二类Stirling数实际上是集合的一个拆分,表示将n个不同的 ...

  9. 各大Oj平台介绍[转]

    1.题库与网站资源题库-在线提交系统(Online Judge)简介   下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...

随机推荐

  1. hive2.0函数大全

    Hive2.0函数大全(中文版)   摘要 Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 目录 数学函数 ...

  2. 使用http-server开启一个本地服务器

    前言 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时,HTML页面就无法正常打开,为了解决这种情况,需要在在本地 ...

  3. Lucene倒排索引结构及关系

  4. Thingworx SDK开发自定义Widget

    Thingworx自带的图表数量有限,样式也很有限,在echarts上看到了这样一个非常简单的图表,下面将做一个简单的静态引入示范 首先创建Thingworx项目 然后右键ui新建widget 自动生 ...

  5. SpringMVC(六)POJO类作为 @RequestMapping方法的参数

    Command or form objects to bind request parameters to bean properties (via setters) or directly to f ...

  6. protocol 和delegate(协议和代理)的区别

    定义 protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话): delegate:中文叫代理或委托, ...

  7. MobilNnet

    一.参数数量和理论计算量 1.定义 参数数量(params):关系到模型大小,单位通常为M,通常参数用 float32 表示,也就是每个参数占4个字节,所以模型大小是参数数量的 4 倍 理论计算量(F ...

  8. JWT加密

    JWT是一种加密算法,为了防止请求的信息在传输途中被拦截修改 JWT的引用: install-package jwt JWF由三部分组成:Header,Payload,Signature Payloa ...

  9. [spoj] HIGH - Highways (生成树计数)

    传送门 输入格式: 第一行一个整数T,表示测试数据的个数 每个测试数据第一行给出 n,m 分别表示点数与边数 接下来 m 行,每行给出两个数 a,b ,表示 a,b 之间有一条无向边 输出格式: 每个 ...

  10. Eigen下载安装

    首先提供Eigen的两个重要网站 官方网站 下载地址 1.下载 wget http://bitbucket.org/eigen/eigen/get/3.3.5.tar.gz 2.解压缩 tar -zx ...