链接:

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. the little schemer 笔记(0)

    the little schemer 笔记 Z.X.L 2012年08月13日 五项规则 car的规则car只对非空列表有定义. cdr的规则cdr只对非空列表有定义.任何非空列表的cdr是另外一个列 ...

  2. AtCoder Grand Contest 017 A

    Problem Statement There are N bags of biscuits. The i-th bag contains Ai biscuits. Takaki will selec ...

  3. 递推DP URAL 1031 Railway Tickets

    题目传送门 /* 简单递推DP:读题烦!在区间内的都更新一遍,dp[]初始化INF 注意:s1与s2大小不一定,坑! 详细解释:http://blog.csdn.net/kk303/article/d ...

  4. 利用uiautomator实现Android移动app启动时间的测试

    为了减少因手工测试的反应误差,这里介绍下如何利用Android自带的自动化测试工具uiautomator实现app启动时间的测试. 测试基本思路如下: 1.启动前记录当前的时间戳 2.启动app,直至 ...

  5. 使用statement接口实现增,删,改操作

  6. spark block读写流程分析

    之前分析了spark任务提交以及计算的流程,本文将分析在计算过程中数据的读写过程.我们知道:spark抽象出了RDD,在物理上RDD通常由多个Partition组成,一个partition对应一个bl ...

  7. CSS div 塌陷问题

    嵌套塌陷 上下塌陷 overflow:hidden;

  8. 【转】java节省内存的几条建议

    下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1. 尽量在合适的场合使用单例   使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单 ...

  9. mac osx上为qt应用生成debug symbol

    mac平台上,希望Qt编译的release程序也能包含debug symbol,这样出问题以后便于查找问题 开始按照http://doc.qt.io/qt-4.8/mac-differences.ht ...

  10. 3.12 在运算和比较时使用NULL值

    问题:NULL值永远不会等于或不等于任何值,也包括NULL值自己,但是需要像计算真实值一样计算可为空列的返回值.例如,需要在表emp中查出所有比“WARD”提成(COMM)低的员工,提成为NULL(空 ...