[最短路]猛犸不上 Ban 2021RoboCom决赛D
在一个名叫刀塔的国家里,有一只猛犸正在到处跑着,希望能够用它的长角抛物技能来撞飞别人。已知刀塔国有 N 座城市,城市之间由 M 条道路互相连接,为了拦住这头猛犸,每条道路上设置了 Vi 人的团队。
这只猛犸从 S 号城市出发,它可以选择:
- 在不重复地经过若干条道路后回到 S 号城市;
- 在不重复地经过若干条道路后到达 T 号城市。
猛犸经过一条道路后,就会把路上的人全部撞飞。作为一头爱喝雪碧的仁慈的猛犸,自然希望尽可能的少撞飞人。请你帮忙计算一下在最优的选择下,最少需要撞飞多少人才能够到达目标城市?
输入格式:
输入第一行是四个正整数 N,M,S,T (2≤N≤500,1≤M≤105),表示有 N 个城市,M 条道路,猛犸从 S 号城市出发,可以选择到达 T 号城市。
接下来的 M 行,每行三个正整数 Xi,Yi,Vi (0≤Vi≤100),表示从 Xi 号城市到 Yi 号城市有一条道路,道路上有 Vi 人的团队。道路可双向通行,城市编号从 1 开始,两个城市之间最多只有一条道路,且没有一条道路连接相同的城市。
数据保证两种选择里至少有一种是可行的。
输出格式:
输出两行,第一行是两个数字,分别对应上面的两种选择分别最少需要撞飞多少人。如果无论撞飞多少人都无法满足选择要求,则输出 -1
。
第二行是一个句子,如果第一种(回到原点)的选择比较好,就输出 Win!
,否则输出Lose!
。
输入样例:
5 6 1 5
1 2 1
2 3 2
3 4 3
4 1 5
3 5 4
4 5 1
输出样例:
在这里给出相应的输出。例如:
11 6
Lose!
题意: 有n个点m条边,起点s和终点t,现在猛犸有两种行动路径,一种是从s走到t,一种是从s出发转一圈再回到s,两种行动都不允许重复经过同一条边,问各自最短路是多少。
分析: 对于从s到t的最短路很简单,就是套一个dijkstra板子,对于从s出去再绕一圈回来的情况,其实就相当于从s的某个相邻节点i出发,并且删掉i到s的那条边的情况下从i走到s的最短路,再加上i到s的边权就是这一圈下来从i出发的最短路了,猛犸可能从s的各个相邻点出发,所以需要每个相邻点都处理一遍,也就是跑最多n-1次dijkstra,取一个最小值就是绕圈下的最短路了,时间复杂度为O(n*m*logn),如果不使用堆优化的dijkstra可能会更快。
具体代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
#define pii pair<int, int>
using namespace std;int n, m, s, t, mn;
vector<pii> g[505];
bool vis[505];
int dis[505];void dijkstra(int s, int type){priority_queue<pii, vector<pii>, greater<pii> >q;dis[s] = 0;q.push(make_pair(dis[s], s));while(q.size()){int now = q.top().second;q.pop();if(vis[now]) continue;vis[now] = true;for(int i = 0; i < g[now].size(); i++){int to = g[now][i].second, w = g[now][i].first;if(type == 1 && now == s && to == ::s) continue;//禁用某条边 if(dis[to] > dis[now]+w){dis[to] = dis[now]+w;q.push(make_pair(dis[to], to));}}}
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m >> s >> t;for(int i = 1; i <= n; i++){dis[i] = inf;vis[i] = false; } for(int i = 1; i <= m; i++){int u, v, w;cin >> u >> v >> w;g[u].push_back(make_pair(w, v));g[v].push_back(make_pair(w, u));}dijkstra(s, 0);int temp = dis[t]; int mn = inf;for(int i = 0; i < g[s].size(); i++){int to = g[s][i].second, w = g[s][i].first;for(int j = 1; j <= n; j++){vis[j] = false;dis[j] = inf;}dijkstra(to, 1);mn = min(mn, dis[s]+w);}if(mn != inf) cout << mn << " ";else cout << "-1 ";if(temp != inf) cout << temp;else cout << "-1";cout << endl;if(mn < temp) cout << "Win!";else cout << "Lose!";return 0;
}
[最短路]猛犸不上 Ban 2021RoboCom决赛D相关推荐
- 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4猛犸不上 Ban(最短路)
样例输入: 5 6 1 5 1 2 1 2 3 2 3 4 3 4 1 5 3 5 4 4 5 1 样例输出: 11 6 Lose! 分析:对于第二种选择显然直接跑一边最短路就可以了,这里就不多说了, ...
- 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4 猛犸不上 Ban
输入样例: 5 6 1 5 1 2 1 2 3 2 3 4 3 4 1 5 3 5 4 4 5 1 输出样例: 在这里给出相应的输出.例如: 11 6 Lose! 解题思路:对于第二种情况直接以s为起 ...
- 随笔-猛犸不上ban
- 猛犸不上班--2021RoboCom决赛补题
题目链接: 猛犸不上 Ban 题意: 有n个城市,m条路,每条路上有w个人. 一只猛犸从 S 号城市出发,它有两种选择: 在不重复地经过若干条道路后回到 S 号城市: 在不重复地经过若干条道路后到达 ...
- 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流
原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...
- Codeforces Roun d #621 (Div. 1 + Div. 2) D. Cow and Fields 最短路+贪心 图上特殊点加边使最短路最大
题目链接:https://codeforces.ml/contest/1307/problem/D 题目大意: 有一个无向图n个点m条边,其中有k个特殊点.现在让你在两个特殊点之间连一条边.让1到n的 ...
- 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)题解
7-1 绿地围栏 (20 分) 市政规划了一块绿地,需要采购一批围栏将绿地围起来. 为了简单起见,我们假设绿地的形状是个封闭连通的规则多边形,即所有边都是互相垂直或平行的,并且没有交叉的十字边.我们指 ...
- 图论 —— 最短路 —— Bellman-Ford 算法与 SPFA
[概述] Bellman-Ford算法适用于计算单源最短路径,即:只能计算起点只有一个的情况. 其最大特点是可以处理存在负边权的情况,但无法处理存在负权回路的情况. 其时间复杂度为:O(V*E),其中 ...
- 大数据平台之初体验 | 网易猛犸 | 数据仓库、调度系统、数据质量、离线与实时计算应有尽有。
一句话介绍 一站式大数据管理和应用开发平台,具有敏捷易用,成熟稳定,安全可靠,开放灵活的特点. 平台架构 产品功能 1.大规模数据存储与计算 支持不同的存储方案和计算方案,灵活满足客户的需求.支持 H ...
最新文章
- 数据库--循环语句:loop exit when/ end loop
- 这个ERP的冬天好冷啊!
- 一条代码解决各种IE浏览器兼容性问题
- 音视频技术开发周刊 | 206
- 电脑f2还原系统步骤_使用冰点还原电脑每次重启都会还原,打造一个百毒不侵的系统...
- 将Teams app升级到net6
- jQuery 对HTML的操作(二)
- 如何动态在maven插件中加载项目及第三方类
- 20165203《Java程序设计》第四周学习总结
- 更改后缀为.dex文件为.odex文件 让你的程序瘦身 运行更稳定
- php mongodb获取指定字段,Mongodb 根据子文档的某个特定字段排序的问题
- AJAX 框架Jquery的使用方法
- ResNet 6大变体对比
- 测试用例的定义,测试用例模板,测试用例的作用,测试用例编写注意事项
- SQL 插入时直接插入当前时间
- C语言基础学习——基本数据类型(float型)
- Chrome下载文件,文件名出现乱码解决
- You are what you read 笔记
- Python中面向对象(类,对象,魔法,打印)
- JDBC之CallableStatement执行存储过程