Cow and Fields
2022/1/18 23:06:25
本文主要是介绍Cow and Fields,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
DIV1+2-D
题意:
给你n个点m条边和k个特殊点,然后你可以选择其中两个特殊点,然后连接一条边。然后问你从1到n的最短路的最大值是多少。
思考:
刚开始一看这种加边的感觉挺复杂,但是这个题只要加一条边。然后问你1到n的最大值,那如果每次建边跑spfa肯定超。想到只能建立一条边,那么先求两次最短路,一次是1到其他点的距离,二次是n到其他点的距离,然后就可以选择两个特殊点a,b。求出min(dist1[a]+dist2[b],dist1[b],dist2[a])。求这样的最大值。如果直接枚举a和b肯定是超时的。这里想到以前做的国王的游戏,按贪心去排序,先假设dist1[a]+dist2[b]<=dist1[b],dist2[a],那么就需要按dist1[a]-dist1[b]<dist2[a]-dist2[b]排列。然后就可以一遍遍历所有特殊点,用maxn维护dist1[a]的最大值,然后中间不断更新maxn+dist2[b]+1。即可。为啥要这样呢,因为只有排序之后才能保证,先选dist1再选dist2是合法的。只要保证了先选dist1我们就可以一遍遍历中间维护更新的方式求出答案,否则不能保证先选dist1是对的。
代码:
int T,n,m,k; int va[N]; int dist1[N],dist2[N]; int vis[N]; vector<int > e[N]; bool cmp(int A,int B) { return dist1[A]-dist2[A]<dist1[B]-dist2[B]; } void spfa(int x,int dist[]) { mem(vis,0); queue<int > q; q.push(x); vis[x] = 1; dist[x] = 0; while(q.size()) { auto now = q.front(); q.pop(); vis[now] = 0; for(auto spot:e[now]) { if(dist[spot]>dist[now]+1) { dist[spot] = dist[now]+1; if(!vis[spot]) { q.push(spot); vis[spot] = 1; } } } } } signed main() { IOS; cin>>n>>m>>k; for(int i=1;i<=k;i++) cin>>va[i]; for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; e[a].pb(b); e[b].pb(a); } mem(dist1,0x3f),mem(dist2,0x3f); spfa(1,dist1); spfa(n,dist2); sort(va+1,va+1+k,cmp); int maxn = dist1[va[1]],ans = 0; for(int i=2;i<=k;i++) { ans = max(ans,maxn+dist2[va[i]]+1); maxn = max(maxn,dist1[va[i]]); } cout<<min(dist1[n],ans); return 0; }
总结:
多多积累经验,多多思考和联系以前的方法优化之类的。
这篇关于Cow and Fields的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享