链接:

https://www.nowcoder.com/acm/contest/52/K

题意:

给定n个点,每个点有自己的权值, 然后让你添加n-1条边,使其边权和最大, 边权的定义是两点的点权和除2。

分析:

一开始我想到的是裸的最小生成树, 用优先队列优化的prim算法200ms过了,复杂度是O(mlogn),m是边数,n是点数 ,代码如下

 #include <bits/stdc++.h>
using namespace std;
struct edge{int to, dis; edge(int _to, int _dis):to(_to), dis(_dis){}};
const int maxn = 1e3 + ;
const int maxm = maxn * maxn;
vector<edge> G[maxn];
int a[maxn];
int n;
int prim(){
int ans = ;
int dis[maxn];
bool vis[maxn];
priority_queue<pair<int, int>, vector<pair<int, int> >, less<pair<int, int> > > q;
memset(dis, -, sizeof(dis));
memset(vis, , sizeof(vis));
for(int i = ; i < G[].size(); i++){
int v = G[][i].to, d = G[][i].dis;
dis[v] = d;
q.push(make_pair(d,v));
}
dis[] = , vis[] = ;
while(!q.empty()){
int u = q.top().second, d = q.top().first;
q.pop();
if(vis[u]) continue;
vis[u] = ;
ans += d;
for(int i = ; i < G[u].size(); i++){
int v = G[u][i].to, d = G[u][i].dis;
if(!vis[v] && (dis[v] < d)){//注意prim的松弛条件别写错
dis[v] = d;
q.push(make_pair(dis[v], v));
}
}
} return ans;
}
int main(){
int T;
scanf("%d", &T);
while(T--){
for(int i = ; i < maxn; i++) G[i].clear();
scanf("%d", &n);
for(int i = ; i < n; i++) scanf("%d", &a[i]);
for(int i = ; i < n; i++)
for(int j = i + ; j < n; j++){
G[i].push_back(edge(j, (a[i] + a[j]) / ));
G[j].push_back(edge(i, (a[i] + a[j]) / ));
}
cout << prim() << "\n";
}
return ;
}

prim优先队列

但是看了别人的时间后发现都是10ms以内的,以上的算法大约在n去到10^3已经极限了, 因为完全图边数是n*(n-1)/2

想了想其实这题有个简单的结论,就是“除权值最大的点外,每个点都与权值最大的点相连”,这样可以保证边权取到最大, 而且刚好n-1条边。

 #include <bits/stdc++.h>
using namespace std;
int main(){
int a[];
int n, T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = ; i < n; i++) scanf("%d", &a[i]);
sort(a, a+n);
int ans = ;
for(int i = ; i < n - ; i++) ans += (a[n-] + a[i]) / ;
printf("%d\n", ans);
}
return ;
}

结论

NowCoder栗酱的连通图(最小生成树, 结论)的更多相关文章

  1. 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明

    题目描述         “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...

  2. 简单的数据结构_via牛客网

    题面 链接:https://ac.nowcoder.com/acm/contest/28537/K 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  3. poj3177(边双连通分量+缩点)

    传送门:Redundant Paths 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立 ...

  4. POJ 3177 Redundant Paths (边双连通+缩点)

    <题目链接> <转载于 >>>  > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...

  5. D8 双连通分量

    记得有个梗那一天,zw学生zzh大佬说逃不掉的路变成a不掉的题哈哈哈哈: 分离的路径: BZOJ 1718POJ 3177LUOGU 286: 思路:在同一个边双连通分量中,任意两点都有至少两条独立路 ...

  6. poj 3177 Redundant Paths(边双连通分量+缩点)

    链接:http://poj.org/problem?id=3177 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任 ...

  7. POJ3177:Redundant Paths——题解

    http://poj.org/problem?id=3177 明显要求桥的一道题. (因为有桥就说明只能从那一条路走,换句话说就是只有一种方法) 求完桥后按照结论(加几条边成双连通图的结论,不会请ba ...

  8. POJ3177 边双连通分量

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18580   Accepted: 7711 ...

  9. 浙工大新生赛莫队处理+区间DP+KMP+分析题

    题目描述 读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K. q组询问. 每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n, 求所有满足以下条件的二元组(l2, r2)的数目: ...

随机推荐

  1. Nginx系列篇四:Nginx+keepalived搭建一个高可用的双机双主热备

    建议:先阅读Nginx+keepalived主从配置,因为此篇是接着上篇开始的 上一篇我们简单的介绍了主从配置及其缺点,我们看一下双主热备配置: 2台Nginx+keepalived互为主备,各自绑定 ...

  2. android 多线程(二)

    1. 使用 AsyncTask 实现进度条 package com.test.network; import android.os.AsyncTask; import android.support. ...

  3. logrotate日志转储

    1 工具目录 ***系统开启selinux,logrotate会不生效*** linux默认会安装logrotate工具,自身的boot.log就是通过它分割转储的. [root@webmaster ...

  4. Hdu 5439 Aggregated Counting (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online 找规律)

    题目链接: Hdu 5439 Aggregated Counting 题目描述: 刚开始给一个1,序列a是由a[i]个i组成,最后1就变成了1,2,2,3,3,4,4,4,5,5,5.......,最 ...

  5. cpp extern 关键字用法

    语法说明: extern 可以置于变量或者函数前,以标示变量或者函数的在别的文件中定义,提示编译器遇到此变量和函数后,在其他模块中寻找其定义.此外extern也可用来进行链接指定. 即 extern ...

  6. 基于python的request库,模拟登录csdn博客

    以前爬虫用urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多. 安装requests库     ...

  7. android开发学习 ------- Retrofit+Rxjava+MVP网络请求的实例

    http://www.jianshu.com/p/7b839b7c5884   推荐 ,照着这个敲完 , 测试成功 , 推荐大家都去看一下 . 下面贴一下我照着这个敲完的代码: Book实体类 - 用 ...

  8. AJPFX总结String类的特点

          String str = "abc"; str就是String的一个对象         字符串一旦被赋值, 值就不能再被改变了         举例:String s ...

  9. Git理论知识补充

    转自: http://www.cnblogs.com/hnrainll/archive/2012/11/13/2768003.html 对于任何一个文件,在 Git 内都只有三种状态:已提交(comm ...

  10. Linux OpenGL 实践篇-10-framebuffer

    在之前的实践中我们都是在当前的窗口中渲染,即使用的缓存都是由glutCreateWindow时创建的缓存,我们可称之为默认缓存.它是唯一一个可以被图形服务器的显示系统识别的帧缓存,我们在屏幕上看到的只 ...