HDU ACM 1224 Free DIY Tour (SPFA)
Free DIY Tour
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2735 Accepted Submission(s): 889
【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=1224
【题目意思】题目是说给你一个有环的图,结点之间有路径,每个结点都有个兴趣值,现在给你起点,找一条路径再次回到起点,使经过的结点的兴趣值总和最大,问最大的总和是多少并且输出其路径
【解题思路】其实这题是找最长路径,因为只能从编号小的结点到达编号高的结点,所以其是有向图,所以可以将结点的兴趣值赋值到相连的边上,而转换为求最长路径的问题,因为人水,也是刚开始接触图论算法,一开始选择Dijkstra算法通过修改其中的小部分步骤去计算最长路径,提交一次WA了,后来找到了原因也就是每次当前找到的不一定是最长的路径,这点随便认真地想一下便清楚了,后来想到Bellman-Ford算法,其可以将所有的边考虑到,最终便可以计算出最长的路径,当然写代码的时候还是用回SPFA即对Bellman-Ford算法的一个优化。
为什么可以用Dellman-Ford算法而不可以用Dijsktra算法,因为Dijsktral用的是贪心的思想,每次在当前找到了最短的路径修改之后就不再考虑以后有没有更短的路径,这也是Dijsktra不能用在有负权边的原因,而Delman-Ford是到最后算法结束之后才能确定源点到当前点的最短距离,所以这也是为什么可以用在求最长路径上,而能用在求最长路径上的前提是其不能有环,而这题虽然说有环,但是好在题目说明终点的编号是(N+1)且该图是有向的。
#include <cstdio>
#include <queue>
#include <cstring> using namespace std; const int NV = ;
const int NE = ;
const int INF = <<;
int ne, nv, tot, max_node;
bool vis[NV];
int dist[NV];
int pre[NV];
struct Edge{
int u, v, cost, next;
Edge(){}
Edge(int a, int c){u = a, cost = c;}
Edge(int a, int b, int c, int d){u = a, v = b, cost = c, next = d;}
bool operator < (const Edge& x) const
{
return cost < x.cost;
}
}edge[NE];
int eh[NV];
int wei[NV]; void SPFA(int s = )
{
for(int i = ; i <= nv; ++i) dist[i] = i == s ? : -INF;
queue<Edge> que;
que.push(Edge(s, ));
vis[s] = true;
while(!que.empty())
{
Edge tmp = que.front();
int u = tmp.u;
que.pop();
vis[u] = false;
for(int i = eh[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if(dist[v] < edge[i].cost + dist[u])
{
dist[v] = edge[i].cost + dist[u];
pre[v] = u;
if(!vis[v])
{
que.push(Edge(v, dist[v]));
vis[v] = true;
} }
}
}
return;
} void addedge(int u, int v, int cost)
{
Edge e = Edge(u, v, cost, eh[u]);
edge[tot] = e;
eh[u] = tot++;
return;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int T;
scanf("%d", &T);
for(int t = ; t <= T; ++t)
{
memset(vis, false, sizeof(vis));
memset(eh, -, sizeof(eh));
scanf("%d", &nv);
for(int i = ; i <= nv; ++i)
scanf("%d", &wei[i]);
wei[++nv] = wei[];
scanf("%d", &ne);
for(int i = , u, v; i < ne; ++i)
{
scanf("%d%d", &u, &v);
if(u > v) { u ^= v, v ^= u, u ^= v; }
addedge(u, v, wei[v]);
}
SPFA();
printf("CASE %d#\n", t);
printf("points : %d\n", dist[nv]);
printf("circuit : 1");
int cnt = ;
for(int j = pre[nv]; j != ; ++cnt, j = pre[j])
eh[cnt] = j;
for(int i = cnt-; i >= ; --i)
printf("->%d", eh[i]);
printf("->1\n");
if(t != T) printf("\n");
}
return ;
}
HDU ACM 1224 Free DIY Tour (SPFA)的更多相关文章
- HDU 1224 Free DIY Tour(spfa求最长路+路径输出)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Oth ...
- HDU1224-Free DIY Tour(SPFA+路径还原)
Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project w ...
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发
前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...
- [自娱自乐] 3、超声波测距模块DIY笔记(三)
前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射功率太低问题,对 ...
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- HDU 1024 Max Sum Plus Plus (动态规划)
HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- ACM常用算法及练习(1)
ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...
- HDU 1024 Max Sum Plus Plus(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:有多组输入,每组一行整数,开头两个数字m,n,接着有n个数字.要求在这n个数字上,m块 ...
随机推荐
- 关于小窗滑动,父级body也跟随滑动的解决方案
需求:当前页面是信息列表,所以高度由内容自动填充, 所以页面可以上下滑动,加载更多, 但是下发物料一栏又为一个列表 所以做了一个弹窗框,因为是列表所以高度自然又是不可控的,所以给了一个最大高度,当超出 ...
- go http.Handler
http1 package main import ( "log" "net/http" "fmt" ) func main() { db: ...
- Linux编程 5 (目录重命名与移动mv,删除文件rm,目录创建mkdir删除rmdir,查看file,cat,more,tail,head)
一. 文件重命名与移动(mv) 在linux中,重命名文件称为移动(moving).mv命令可以将文件和目录移动到另一个位置或重新命名. 1.1 使用mv重命名 下面在/usr/local下面创建一个 ...
- MongoDB 日志切割三种方式
MongoDB 日志切割 MongoDB 默认是不会进行切割日志的,除非我们配置了 logRotate = rename,并且重启 MongoDB 服务,才会进行切割日志的,那么为了避免实际中我们 ...
- scala-jdbc-scalike操作jdbc数据库
1, 引入maven依赖 <!-- 使用 sclaikeJDBC --> <dependency> <groupId>org.scalikejdbc</gro ...
- 深度学习论文翻译解析(四):Faster R-CNN: Down the rabbit hole of modern object detection
论文标题:Faster R-CNN: Down the rabbit hole of modern object detection 论文作者:Zhi Tian , Weilin Huang, Ton ...
- SpringMVC Hello World
前言 新年伊始,元宵佳节,窗外灯火通明,炮声连连.北漂以来第一次一个人在北京过十五. 切入正题,收假后一边要赶项目进度还要学习java,so在元宵佳节之际写了第一篇SpringMVC Hello Wo ...
- [转]基于boot2docker部署Docker环境
本文转自:https://www.cnblogs.com/52fhy/p/8413029.html Docker轻量级的特性使得我们可以快速打包开发环境:一处编译,到处使用.我们可以在第一次编译好需要 ...
- .Net Core 简单定时任务框架封装
有段日子没有更新,写点东西冒个泡 .这篇文章过来讲个小东西,也是大家在日常开发中也经常需要面临的问题:后台定时任务处理.估计大家看到这句就已经联想到 QuartZ 等类似第三方类库了,不好意思,后边的 ...
- 如何为你的树莓派安装一个WIN10系统?(非iot)
Windows10 ARM版,是的,这次并非IoT版,而是功能与PC一致的ARM版.需要注意的是,这个方法并非官方提供的,可用性上会有一些坑,热衷于尝试的玩家可以一试! 准备项目:树莓派3B以上型号, ...