S - Extended Traffic LightOJ - 1074
S - Extended Traffic LightOJ - 1074
题意: 每个点有一个点权,边权为边的(终点点权-起点点权)的立方, 求从 1 出发的最短路
思路一:DJ,太简单了
结果一发WA了,妙啊,记得考虑负边权,可能有负环
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 210;
const int inf = 0x3f3f3f3f;
int mp[maxn];
int n, m;int head[maxn], cnt, dis[maxn];
bool vis[maxn];
struct edge {int to, next, w;
}e[maxn*maxn];void add(int u, int v, int w) {e[++cnt].next = head[u]; e[cnt].to = v; e[cnt].w = w; head[u] = cnt;
}typedef struct node {int u, dist;node (int _u, int _dist) : u(_u), dist(_dist) {}
} cam;bool operator < (const cam &a, const cam &b) {return a.dist > b.dist;
}void dijkstra() {memset(dis, inf, sizeof(dis));priority_queue<cam> heap;heap.push(cam(1, 0));while(heap.size()) {cam now = heap.top(); heap.pop();int u = now.u; int dist = now.dist;if(vis[u]) continue;vis[u] = 1;for(int i = head[u]; i; i = e[i].next) {int to = e[i].to;if(dis[to] > dist + e[i].w) {dis[to] = dist + e[i].w;heap.push(cam(to, dis[to]));}}}}void init() {memset(head, 0, sizeof(head));cnt = 0;memset(vis, 0, sizeof(vis));
}int main() {// freopen("test.in", "r", stdin);int T; scanf("%d", &T);int kase = 0;while(T--) {init();scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &mp[i]);scanf("%d", &m);int u, v, w;for(int i = 1; i <= m; i++) {scanf("%d%d", &u, &v);w = (mp[v] - mp[u])*(mp[v] - mp[u])*(mp[v] - mp[u]);add(u, v, w);}dijkstra();int q; scanf("%d", &q);printf("Case %d:\n", ++kase);while(q--) {int k; scanf("%d", &k);if(dis[k] == inf || dis[k] < 3) printf("?\n");else printf("%d\n", dis[k]);}}return 0;
}
思路二:转战 SPFA
直接判环的话: O(VE*T) == O(4E4 * 2E2 * 50) 超 1E8了, 所以如果直接在 SPFA 内不停的跑到所有负环内的点都找出来,肯定 TLE 了
那就剪枝,直接找出一个 负环 内的点后,通过dfs标记它能走到的所有点,即这些点的到起点的距离可以无限小
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 210;
const int inf = 0x3f3f3f3f;
int mp[maxn];
int n, m;int head[maxn], cnt, dis[maxn], num[maxn];
bool vis[maxn], flag[maxn];
struct edge {int to, next, w;
}e[maxn*maxn];void add(int u, int v, int w) {e[++cnt].next = head[u]; e[cnt].to = v; e[cnt].w = w; head[u] = cnt;
}void dfs(int u) {flag[u] = 1;for(int i = head[u]; i; i = e[i].next)if(!flag[e[i].to]) dfs(e[i].to);
}void spfa() {memset(dis, inf, sizeof(dis));dis[1] = 0;queue<int> Q;Q.push(1); vis[1] = 1;num[1] ++;while(Q.size()) {int now = Q.front(); Q.pop(); vis[now] = 0;for(int i = head[now]; i; i = e[i].next) {int to = e[i].to;if(dis[to] > dis[now] + e[i].w) {dis[to] = dis[now] + e[i].w;if(vis[to]) continue;Q.push(to); vis[to] = 1;if(++num[to] > n) {dfs(to); return ;}}}}return ;
}void init() {memset(head, 0, sizeof(head));cnt = 0;memset(vis, 0, sizeof(vis));memset(flag, 0, sizeof(flag));memset(num, 0, sizeof(num));
}int main() {// freopen("test.in", "r", stdin);int T; scanf("%d", &T);int kase = 0;while(T--) {init();scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &mp[i]);scanf("%d", &m);int u, v, w;for(int i = 1; i <= m; i++) {scanf("%d%d", &u, &v);w = (mp[v] - mp[u])*(mp[v] - mp[u])*(mp[v] - mp[u]);add(u, v, w);}spfa();int q; scanf("%d", &q);printf("Case %d:\n", ++kase);while(q--) {int k; scanf("%d", &k);if(flag[k] || dis[k] == inf || dis[k] < 3) printf("?\n");else printf("%d\n", dis[k]);}}return 0;
}
S - Extended Traffic LightOJ - 1074相关推荐
- LightOJ - 1074 Extended Traffic(最短路+判断负环)
题目链接:点击查看 题目大意:给出n个城市,每个城市都有一个拥挤度,从a到b的时间是(b的拥挤度-a的拥挤度)^3,点1为起点,求最短时间 题目分析:这个题第一感觉是个裸题,n还非常小,偷了个懒上了一 ...
- LightOJ 1074 Extended Traffic(spfa+dfs标记负环上的点)
题目链接:https://cn.vjudge.net/contest/189021#problem/O 题目大意:有n个站点,每个站点都有一个busyness,从站点A到站点B的花费为(busynes ...
- lightoj刷题日记
开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: ----------------- 必须要update了... so...板刷第二页搞呀--2017/4/17 ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- 算法学习经典例题整理
陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...
- kuangbin带你飞 专题1-23 题单
kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...
- [kuangbin带你飞]专题四 做题顺序与题解 【最短路练习】
随便说点: 博主正在刷kuangbin专题的题目,初学者,没接触过什么算法,刷题的初衷是备战蓝桥杯,后来发现了算法资料大多是针对acm的,挑选kuangbin专题入门也是如此,毕竟这样分类看起来能达到 ...
- Kuangbin最短路专题
菜鸡第一篇博客 整理一下kuangbin的最短路专题(主要是ide出问题了没事干 目录 一.POJ 2387 Till the Cows Home SPFA板子 二.POJ 2253 Frogger ...
- 老鱼的-kuangbin专题题解
kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...
最新文章
- mysql hang_mysql夯hang死堆栈采集工具
- 一文搞懂select语句在MySQL中的执行流程!
- plotly同时可视化表格与图(plotly Table and Chart )
- java的concurrent包
- 【企业管理】2019年11 月 每日花语
- 霸榜COCO和Cityscapes!南理工CMU提出极化自注意力,更精细的双重注意力建模结构
- 怎样快速识别 英文地址中包含非英文字符_[论文笔记]端到端的场景文本识别算法--CRNN 论文笔记...
- python re 正则表达式
- 八邻域轮廓跟踪算法_结合mRMR选择和IFCM聚类的遥感影像分类算法
- python最简分数_592. 分数加减法运算(Python)
- 生成对抗网络(GAN)的发展史
- Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
- Android学习笔记----18_在SQLite中使用事务
- ruby学习--block
- Spring boot 2.x + Thymeleaf 公共部分抽取
- 邬建国教授受聘为浙江大学光彪教授
- java 替换pdf 文本_java 查找替换pdf中的指定文本
- 电力电子,电机控制系统的建模与仿真
- android oppo 模拟器,小姚Android构建VIVO华为魅族OPPO小米联想手游Android模拟器
- Science 李伟/周琪团队联合开发染色体编辑新技术,创建全新核型小鼠,哺乳动物染色体尺度基因组重塑元年...
热门文章
- C++ 中的卷积神经网络 (CNN)
- 219个opencv常用函数汇总
- 4个计算机视觉领域用作迁移学习的模型
- Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架
- spring cloud互联网分布式微服务云平台规划分析--服务统一配置中心
- Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
- java- ASM 字节码操控框架
- 对10个整数按由大到小顺序排序
- 服务器虚拟化组网方案,服务器虚拟化部署方案计划.doc
- 太牛了 Python期末复习总结,提高成绩必备回家过个开心年