链接:

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. deque双向队列

    对于双向队列,与队列queue以及vector容器的区别就在于,名字不同,也就是它是双向的,可以从头开始操作,也可以从末尾开始操作. 双向队列的常用方法跟队列queue差不多: 头文件: #inclu ...

  2. Markdown 简单使用教程

    标题: # 一级标题 ## 二级标题 增加星号,字号相应变小,共有6级 列表: - 无序列表 编号.  有序列表 插入链接: [显示文本](链接地址) 插入图片: ![](图片地址) 引用: > ...

  3. 题解报告:hdu 1520 Anniversary party(树形dp入门)

    Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...

  4. h5-25-地理定位配合百度地图

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  5. CentOS 6.9:MySQL Daemon failed to start.

    [root@Server_1 12:02:58 ~ 25]#service mysqld start MySQL Daemon failed to start.Starting mysqld: [ro ...

  6. Ionic之增加样式会自动换行解决方案

    设置样式的时候,引用自身的样式,能正常显示,但是引用自定义样式显示的时候,竟然或自动换行,好尴尬. 原本代码: $('.codeSuccess').css({'display':'block'}); ...

  7. P1554 梦中的统计

    题目背景 Bessie 处于半梦半醒的状态.过了一会儿,她意识到她在数数,不能入睡. 题目描述 Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数.她开始注意每一个数码(0..9):每一 ...

  8. PKU_campus_2018_D Chocolate

    思路: 题目链接http://poj.openjudge.cn/practice/C18D/ kruskal过程中使用乘法原理计数. 实现: #include <bits/stdc++.h> ...

  9. Linux 合并多个txt文件到一个文件

    Linux 或 类Unix 下实现合并多个文件内容到一个文件中 代码如下 cat b1.txt b2.txt b3.txt > b_all.txt 或者 cat *.txt > merge ...

  10. java实现网络监听

    Java实现网络监听 import java.net.*; import java.io.*; public class tcpServer { public static void main(Str ...