题解

我的歪解

我首先想的是分治,我想二分肯定不行,因为它是没有单调性的。

我想了一下感觉它的大部分数据应该是有凸性的(例如\(y=x^2\)的函数图像),所以可以三分。

下面是我的三分代码(骗了不少分)

三分模板没过的我居然瞎歪歪了一个三分

歪解code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#define ll long long
#define R register
#define N 400005
#define INF 0x7fffffffffffLL
using namespace std;
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;
}
ll n,m,c,tot,h[N],vis[N],pd[N];
ll dist[N],sum,now_ans,now;
struct bian{int u,v;ll w;
}b[N];
struct node{int nex,to;ll dis;
}edge[N<<1];
inline void add(R int u,R int v,R ll w){edge[++tot].nex=h[u];edge[tot].to=v;edge[tot].dis=w;h[u]=tot;
}
inline void spfa(R int s){for(R int i=1;i<=n;i++)dist[i]=INF;queue<int> q;q.push(s);dist[s]=0;vis[s]=1;while(!q.empty()){R int x=q.front();q.pop();vis[x]=0;for(R int i=h[x];i;i=edge[i].nex){R int xx=edge[i].to;if(dist[xx]>dist[x]+edge[i].dis){dist[xx]=dist[x]+edge[i].dis;if(!vis[xx]){vis[xx]=1;q.push(xx);}}}   }
}
inline ll check(R ll mid){ll tot=0;for(R int i=1;i<=n;i++)pd[i]=0;for(R int i=1;i<=n;i++)if(dist[i]<=mid)pd[i]=1;for(R int i=1;i<=m;i++)if(pd[b[i].u]&&pd[b[i].v])tot+=b[i].w;return tot-mid*c;//这是你能节省的
}
int main(){ read(n);read(m);read(c);for(R int i=1;i<=m;i++){read(b[i].u);read(b[i].v);read(b[i].w);add(b[i].u,b[i].v,b[i].w);add(b[i].v,b[i].u,b[i].w);sum+=b[i].w;}spfa(1);R ll l=0,r=sum;while(l<=r){R ll tmp=(r-l)/3;R ll mid1=l+tmp;R ll mid2=r-tmp;if(check(mid1)>check(mid2)) r=mid2-1;else l=mid1+1;}ll tmp=check(l),temp=check(r);if(tmp>temp)now=l,now_ans=tmp;else now=r,now_ans=temp;printf("%lld\n",sum-now_ans);return 0;
}

当然了,三分本来就是一个非常好的骗分算法(也会是正解),有些题在加一些暴力,一定会有神奇的效果;

讲课老师说加上暴力这道题应该可以\(A\)掉,但懒惰的我并没有去实践,有兴趣的可以试一试;

正解

这其实是一道经典的最短路的一种题型。

先跑一遍\(SPFA\),处理出\(dist\)数组;

然后再利用\(dist\)数组处理出每一条边的\(maxdis\);

将\(maxdis\)数组从小到大排序(结构体排序);

看完图应该都懂了吧。

code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#define ll long long
#define R register
#define N 800005
#define int long long
#define INF 9999999999999999LL
using namespace std;
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;
}
ll n,m,c,tot,h[N],vis[N],pd[N],maxdis[N];
ll dist[N],sum,ans,maxsum;
struct bian{int u,v,w;
}b[N];
struct node{int nex,to,dis;
}edge[N<<1];
struct MAX{int maxdis,id;friend bool operator < (const MAX &a,const MAX &b){return a.maxdis<b.maxdis;}
}md[N];
inline void add(R int u,R int v,R int w){edge[++tot].nex=h[u];edge[tot].to=v;edge[tot].dis=w;h[u]=tot;
}
inline void spfa(R int s){for(R int i=1;i<=n;i++)dist[i]=INF;queue<int> q;q.push(s);dist[s]=0;vis[s]=1;while(!q.empty()){R int x=q.front();q.pop();vis[x]=0;for(R int i=h[x];i;i=edge[i].nex){R int xx=edge[i].to;if(dist[xx]>dist[x]+edge[i].dis){dist[xx]=dist[x]+edge[i].dis;if(!vis[xx]){vis[xx]=1;q.push(xx);}}}   }
}
signed main(){ read(n);read(m);read(c);for(R int i=1;i<=m;i++){read(b[i].u);read(b[i].v);read(b[i].w);add(b[i].u,b[i].v,b[i].w);add(b[i].v,b[i].u,b[i].w);sum+=b[i].w;}spfa(1);for(R int i=1;i<=m;i++)md[i].maxdis=max(dist[b[i].u],dist[b[i].v]),md[i].id=i;sort(md+1,md+1+m);ans=sum;for(R int i=1;i<=m;i++){sum-=b[md[i].id].w;ans=min(ans,1LL*md[i].maxdis*c+sum);}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/ZAGER/p/9817918.html

【AT2434】JOI 公園 (JOI Park) 最短路+贪心相关推荐

  1. [旅遊]湖南省博物館長沙烈士公園

    因為COVID-19疫情關係,2020年的農曆年顯得不一樣,除了配合政策選擇在工作地過年,同時也可安排到平常無暇參觀的附近景點走走,轉換平時工作的狀態. 因緣際會,在一次觀賞關於兵馬俑紀錄片中,提及湖 ...

  2. Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心

    题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...

  3. CodeForces - 1076D Edge Deletion(最短路+贪心/最短路树+bfs)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边的带权无向图,设 d[i]d[ i ]d[i] 为从点 1 到点 i 的最短路,现在要求保留最多 k 条边,使得新图中 d′[i]=d[i]d ...

  4. Codeforces Roun d #621 (Div. 1 + Div. 2) D. Cow and Fields 最短路+贪心 图上特殊点加边使最短路最大

    题目链接:https://codeforces.ml/contest/1307/problem/D 题目大意: 有一个无向图n个点m条边,其中有k个特殊点.现在让你在两个特殊点之间连一条边.让1到n的 ...

  5. 前端学习(1402):多人管理22验证joi

    // 引入joi模块 const Joi = require('joi');// 定义对象的验证规则 const schema = {username: Joi.string().min(2).max ...

  6. Joi验证模块的使用

    1. 安装 官网中文文档:https://joi.dev/api/?v=12.1.0#validatevalue-schema-options-callback //下载14.3.1 npm inst ...

  7. TypeError:Joi.validate is not a function 解决办法

    TypeError:Joi.validate is not a function 解决办法 报错如下 解决办法 把最新版本的joi卸载,下以前的joi版本 //卸载当前目录下的joi node uni ...

  8. @hapi/joi 报错 “message“: “Cannot mix different versions of joi schemas“

    问题: 使用 @hapi/joi 报错 "message": "Cannot mix different versions of joi schemas" np ...

  9. Cannot mix different versions of joi schemas

    问题内容:使用 @hapi/joi 报错 "message": "Cannot mix different versions of joi schemas" 问 ...

最新文章

  1. Xamarin iOS教程之显示和编辑文本
  2. Python 传值和传址 copy/deepcopy
  3. android 6.0虚拟内存,Maxwell的统一虚拟内存只用在专业卡上,GTX 750 Ti或无缘
  4. 在 emu8086 中学习汇编In,Out指令
  5. 机器学习算法精讲20篇(一)-k-means聚类算法应用案例(附示例代码)
  6. 值得深思:美国感恩节78.3%的网购来自iOS
  7. EXCEL利用VBA自由控制图表绘图区大小
  8. ReentrantLock 的实现原理
  9. django和flask用MD5加密密码
  10. win10下TensorFlow-GPU安装(GTX1660+CUDA10+CUDNN7.4)
  11. 控制cpu_I/O控制器及控制方式,了解一下
  12. cte公用表表达式_SQL Server中的CTE; 查询公用表表达式
  13. Hbase与传统关系型数据库对比
  14. 今日头条 h5 源码 php,今日头条H5移动端APP页面
  15. 用Python输出100以内的质数
  16. 数据不落地、移动新应用、安全更可靠
  17. Beaglebone Black–智能家居控制系统 LAS - 用 UART 连接 ESP8266 (ESP-01 版)
  18. Sparrow: 适用于细粒度tasks低延迟调度的去中心化无状态分布式调度器
  19. java owc_vbscript ms owc 封裝代码
  20. 算法导论—AC自动机

热门文章

  1. ROS系统的安装 ubuntu 18.04.5 LTS
  2. Java 判断3位数
  3. Python 搜狗站长平台批量添加域名+批量提交链接 过验证码 IP限制
  4. Ubuntu16.04 换阿里源
  5. LuoGu P1909 买铅笔???
  6. AC日记——食物链 codevs 1047
  7. 2012年河南省普通高校招生本科一批院校 平行投档分数线(理科)
  8. 反射中 BindingFlags标识
  9. Pidgin Portable 使用点滴
  10. Linq to xml API中 XName 的奇怪实现