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. DOM基础知识(Node对象、Element对象)

    5.Node对象 u  遍历节点 u 父节点 .parentNode - 获取父节点—> 元素节点或文档节点 .parentElement - 获取父元素节点—> 元素节点 u    子节 ...

  2. zeromq-4.1.2在windows下的编译

    作者:朱金灿 来源:http://blog.csdn.net/clever101 zeromq是一个最近比较火的跨平台消息中间件,最近准备研究它,故下载它的源码编译了一下.我是使用VS2008编译的, ...

  3. Broadcast Receiver广播接收器

    1.概述 广播接收器不仅能接受来自系统的内容,也可以接受来自其他app的内容.广播分为标准广播和有序广播. 2.标准广播 一种完全异步执行的广播,在广播发出之后几乎所有的广播接收器都在同一时刻接受到广 ...

  4. Paper-[acmi 2015]Image based Static Facial Expression Recognition with Multiple Deep Network Learning

    [acmi 2015]Image based Static Facial Expression Recognition with Multiple Deep Network Learning ABST ...

  5. NSPort与NSRunloop的关系是流与消息调度的关系

    NSPort与NSRunloop的关系是流与消息调度的关系. NSPort 将流插入到消息调度队列: 相当于 Socket将流插入到应用一样 - (void)launchThread { NSPort ...

  6. Server初见——python

    import socketphone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind(('127.0.0.1',8080))p ...

  7. Codeforces Round #506 (Div. 3) A-C

    CF比赛题解(简单题) 简单题是指自己在比赛期间做出来了 A. Many Equal Substrings 题意 给个字符串t,构造一个字符串s,使得s中t出现k次;s的长度最短 如t="c ...

  8. MySQL ERROR 1366(HY000) Incorrect string value

    有以下两张表: mysql> show tables; +---------------+ | Tables_in_old | +---------------+ | book | | pres ...

  9. prettier 与 eslint 对比

    Linters have two categories of rules: 代码修正一般有两种规则: Formatting rules: eg: max-len, no-mixed-spaces-an ...

  10. 06 ASP.net

    ASP.net 第一天 理解浏览器与服务器概念,与WinForm的区别. C# IIS(Internet Information Service) 互联网信息服务 Java(Tomcat) Php(A ...