【AT2434】JOI 公園 (JOI Park) 最短路+贪心
题解
我的歪解
我首先想的是分治,我想二分肯定不行,因为它是没有单调性的。
我想了一下感觉它的大部分数据应该是有凸性的(例如\(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) 最短路+贪心相关推荐
- [旅遊]湖南省博物館長沙烈士公園
因為COVID-19疫情關係,2020年的農曆年顯得不一樣,除了配合政策選擇在工作地過年,同時也可安排到平常無暇參觀的附近景點走走,轉換平時工作的狀態. 因緣際會,在一次觀賞關於兵馬俑紀錄片中,提及湖 ...
- 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 ...
- CodeForces - 1076D Edge Deletion(最短路+贪心/最短路树+bfs)
题目链接:点击查看 题目大意:给出一张 n 个点 m 条边的带权无向图,设 d[i]d[ i ]d[i] 为从点 1 到点 i 的最短路,现在要求保留最多 k 条边,使得新图中 d′[i]=d[i]d ...
- Codeforces Roun d #621 (Div. 1 + Div. 2) D. Cow and Fields 最短路+贪心 图上特殊点加边使最短路最大
题目链接:https://codeforces.ml/contest/1307/problem/D 题目大意: 有一个无向图n个点m条边,其中有k个特殊点.现在让你在两个特殊点之间连一条边.让1到n的 ...
- 前端学习(1402):多人管理22验证joi
// 引入joi模块 const Joi = require('joi');// 定义对象的验证规则 const schema = {username: Joi.string().min(2).max ...
- Joi验证模块的使用
1. 安装 官网中文文档:https://joi.dev/api/?v=12.1.0#validatevalue-schema-options-callback //下载14.3.1 npm inst ...
- TypeError:Joi.validate is not a function 解决办法
TypeError:Joi.validate is not a function 解决办法 报错如下 解决办法 把最新版本的joi卸载,下以前的joi版本 //卸载当前目录下的joi node uni ...
- @hapi/joi 报错 “message“: “Cannot mix different versions of joi schemas“
问题: 使用 @hapi/joi 报错 "message": "Cannot mix different versions of joi schemas" np ...
- Cannot mix different versions of joi schemas
问题内容:使用 @hapi/joi 报错 "message": "Cannot mix different versions of joi schemas" 问 ...
最新文章
- Xamarin iOS教程之显示和编辑文本
- Python 传值和传址 copy/deepcopy
- android 6.0虚拟内存,Maxwell的统一虚拟内存只用在专业卡上,GTX 750 Ti或无缘
- 在 emu8086 中学习汇编In,Out指令
- 机器学习算法精讲20篇(一)-k-means聚类算法应用案例(附示例代码)
- 值得深思:美国感恩节78.3%的网购来自iOS
- EXCEL利用VBA自由控制图表绘图区大小
- ReentrantLock 的实现原理
- django和flask用MD5加密密码
- win10下TensorFlow-GPU安装(GTX1660+CUDA10+CUDNN7.4)
- 控制cpu_I/O控制器及控制方式,了解一下
- cte公用表表达式_SQL Server中的CTE; 查询公用表表达式
- Hbase与传统关系型数据库对比
- 今日头条 h5 源码 php,今日头条H5移动端APP页面
- 用Python输出100以内的质数
- 数据不落地、移动新应用、安全更可靠
- Beaglebone Black–智能家居控制系统 LAS - 用 UART 连接 ESP8266 (ESP-01 版)
- Sparrow: 适用于细粒度tasks低延迟调度的去中心化无状态分布式调度器
- java owc_vbscript ms owc 封裝代码
- 算法导论—AC自动机