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相关推荐

  1. LightOJ - 1074 Extended Traffic(最短路+判断负环)

    题目链接:点击查看 题目大意:给出n个城市,每个城市都有一个拥挤度,从a到b的时间是(b的拥挤度-a的拥挤度)^3,点1为起点,求最短时间 题目分析:这个题第一感觉是个裸题,n还非常小,偷了个懒上了一 ...

  2. LightOJ 1074 Extended Traffic(spfa+dfs标记负环上的点)

    题目链接:https://cn.vjudge.net/contest/189021#problem/O 题目大意:有n个站点,每个站点都有一个busyness,从站点A到站点B的花费为(busynes ...

  3. lightoj刷题日记

    开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: ----------------- 必须要update了... so...板刷第二页搞呀--2017/4/17 ...

  4. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  5. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  6. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

  7. [kuangbin带你飞]专题四 做题顺序与题解 【最短路练习】

    随便说点: 博主正在刷kuangbin专题的题目,初学者,没接触过什么算法,刷题的初衷是备战蓝桥杯,后来发现了算法资料大多是针对acm的,挑选kuangbin专题入门也是如此,毕竟这样分类看起来能达到 ...

  8. Kuangbin最短路专题

    菜鸡第一篇博客 整理一下kuangbin的最短路专题(主要是ide出问题了没事干 目录 一.POJ 2387  Till the Cows Home SPFA板子 二.POJ 2253 Frogger ...

  9. 老鱼的-kuangbin专题题解

    kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...

最新文章

  1. mysql hang_mysql夯hang死堆栈采集工具
  2. 一文搞懂select语句在MySQL中的执行流程!
  3. plotly同时可视化表格与图(plotly Table and Chart )
  4. java的concurrent包
  5. 【企业管理】2019年11 月 每日花语
  6. 霸榜COCO和Cityscapes!南理工CMU提出极化自注意力,更精细的双重注意力建模结构
  7. 怎样快速识别 英文地址中包含非英文字符_[论文笔记]端到端的场景文本识别算法--CRNN 论文笔记...
  8. python re 正则表达式
  9. 八邻域轮廓跟踪算法_结合mRMR选择和IFCM聚类的遥感影像分类算法
  10. python最简分数_592. 分数加减法运算(Python)
  11. 生成对抗网络(GAN)的发展史
  12. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
  13. Android学习笔记----18_在SQLite中使用事务
  14. ruby学习--block
  15. Spring boot 2.x + Thymeleaf 公共部分抽取
  16. 邬建国教授受聘为浙江大学光彪教授
  17. java 替换pdf 文本_java 查找替换pdf中的指定文本
  18. 电力电子,电机控制系统的建模与仿真
  19. android oppo 模拟器,小姚Android构建VIVO华为魅族OPPO小米联想手游Android模拟器
  20. Science 李伟/周琪团队联合开发染色体编辑新技术,创建全新核型小鼠,哺乳动物染色体尺度基因组重塑元年...

热门文章

  1. C++ 中的卷积神经网络 (CNN)
  2. 219个opencv常用函数汇总
  3. 4个计算机视觉领域用作迁移学习的模型
  4. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架
  5. spring cloud互联网分布式微服务云平台规划分析--服务统一配置中心
  6. Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
  7. java- ASM 字节码操控框架
  8. 对10个整数按由大到小顺序排序
  9. 服务器虚拟化组网方案,服务器虚拟化部署方案计划.doc
  10. 太牛了 Python期末复习总结,提高成绩必备回家过个开心年