ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))
最短路经典算法-dijkstra范例(两道),第一道是裸的dijkstra,第二道需要枚举所有边已找到可能的情况。
ZOJ2750-Idiomatic Phrases Game
题意:见Code
题解:dijkstra算法需要理解的是松弛操作,这一点掌握好了,其他的代码书写则有点类似于Prim算法,易于掌握。
本题需要记录每一个成语的前4个字符和后4个字符以记录成语的第一个字和最后一个字,博主省略了建图的过程,直接重载了Idiom结构体的“==”运算符,在dijkstra也直接使用了该判断,经过分析可以知道这种算法和利用邻接矩阵建图后再进行dijkstra的算法时间度基本一致O(n^2),因此权当简化代码也好。
//成语接龙-dijkstra
//求从第一个成语道最后一个成语最短耗时(第一个列数据为T,表示需要耗时T后才能接龙下一个成语)
//Time:50Ms Memory:292K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std; #define MAX 1001
#define INF 0x3f3f3f3f struct Idiom {
int time;
char pre[], rear[];
friend bool operator == (Idiom id1, Idiom id2) { return !strcmp(id1.rear, id2.pre); }
}idiom[MAX]; int n;
int d[MAX], mintime; //mintime:最短路耗时
bool v[MAX]; void dijkstra()
{
memset(v, false, sizeof(v));
memset(d, INF, sizeof(d));
v[] = true;
mintime = -; //默认失败
for (int i = ; i < n; i++)
{
if (idiom[] == idiom[i])
d[i] = idiom[].time;
}
for (int i = ; i < n; i++)
{
int mind = INF;
int k;
for (int j = ; j < n;j++)
{
if (!v[j] && mind > d[j])
{
mind = d[j];
k = j;
}
} if (mind == INF) return; //失败
if (k == n - ) { //成功
mintime = d[k];
return;
}
v[k] = true;
for (int j = ; j < n; j++)
if (!v[j] && idiom[k] == idiom[j]) d[j] = min(d[k] + idiom[k].time, d[j]);
}
} int main()
{
while (scanf("%d", &n), n)
{
char str[];
for (int i = ; i < n; i++)
{
scanf("%d%s", &idiom[i].time, str);
int len = strlen(str);
for (int j = ; j < ; j++)
{
idiom[i].pre[j] = str[j];
idiom[i].rear[j] = str[len - + j];
}
idiom[i].pre[] = idiom[i].rear[] = '\0';
} dijkstra();
printf("%d\n", mintime);
} return ;
}
POJ1135(ZOJ1298)-Domino Effect
题意及题解:见Code注释部分
//求从1开始倒下的多米诺骨牌最后倒下的时间及在何处倒下(在两个关键牌中间倒下则输出两个关键牌)
//dijkstra计算最短路,而后枚举每一条边上的时间(不一定在最短路的最大时间点和次大时间点内),以计算最后倒下的时间
//Time:32Ms Memory:1176K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAX 505
#define INF 0x3f3f3f3f int n, m;
int map[MAX][MAX]; //如果MAX达10^4以上,考虑用邻接表
int d[MAX];
bool v[MAX];
int pos; //关键牌编号
double maxtime; //关键牌最后倒下的时间 void dijkstra()
{
memset(v, false, sizeof(v));
memset(d, , sizeof(d));
pos = ; //默认
maxtime = ;
v[] = true;
for (int i = ; i <= n; i++)
d[i] = map[i][];
for (int i = ; i <= n; i++)
{
int mind = INF;
int k = ;
for (int j = ; j <= n; j++)
{
if (!v[j] && mind > d[j])
{
mind = d[j];
k = j;
}
} maxtime = mind;
pos = k;
v[k] = true;
for (int j = ; j <= n; j++) //松弛
if (!v[j]) d[j] = min(d[k] + map[k][j], d[j]);
} }
int main()
{
int cas = ;
while (scanf("%d%d", &n, &m), n || m)
{
memset(map, INF, sizeof(map));
for (int i = ; i < m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
map[u][v] = map[v][u] = w;
}
dijkstra(); printf("System #%d\n", ++cas);
bool flag = false; //存在关键牌外的牌倒下时间更多的情况
int pos1, pos2;
for (int i = ; i <= n; i++)
for (int j = i + ; j <= n; j++)
{
if (map[i][j] != INF && (d[i] + d[j] + map[i][j]) / 2.0 > maxtime)
{
maxtime = (d[i] + d[j] + map[i][j]) / 2.0;
pos1 = i; pos2 = j;
flag = true;
}
} if (flag)
printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n", maxtime, pos1, pos2);
else printf("The last domino falls after %.1f seconds, at key domino %d.\n\n", maxtime, pos);
}
return ;
}
ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))的更多相关文章
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)
两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...
- ACM - ICPC World Finals 2013 C Surely You Congest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering
Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...
- ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time
Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...
- hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...
- 【转】lonekight@xmu·ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
随机推荐
- word中那些重要但是被人忽略的快捷键和长word文档的跳转
重复上一次操作: F4, 这个太重要了,比如你在做一次很复杂的操作, 下一次又要这样操作时就很有用! 如设置 文字的 段落背景/ 底纹颜色!时要多次设置这个时就 非常有用! 段落缩进:ctrl+M : ...
- Rsession让Java调用R更简单
Rsession让Java调用R更简单 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒. ...
- H5移动端知识点总结
H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解display:box的布局 理解flex布局 Flex布局兼容知识点总结 回到顶部 移动开 ...
- AngularJS 使用$sce控制代码安全检查
由于浏览器都有同源加载策略,不能加载不同域下的文件.也不能使用不合要求的协议比如file进行访问. 在angularJs中为了避免安全漏洞,一些ng-src或者ng-include都会进行安全校验,因 ...
- OC第七节——内存管理
戏言: iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的.很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的.So,还 ...
- 【GXZ的原创】C++小游戏——五子棋
前些时候考完试自己编的带有胜负判定的五子棋. 操作方法:WSAD或↑↓←→移动下棋位置,Space或Enter放置. 如果游戏出现bug,欢迎大家在评论区反馈. #include <stdio. ...
- DataTable、List使用groupby进行分组和分组统计;List、DataTable查询筛选方法
DataTable分组统计: .用两层循环计算,前提条件是数据已经按分组的列排好序的. DataTable dt = new DataTable(); dt.Columns.AddRange(new ...
- javascript中对象学习
第一篇文章: javascript中this关键字的详细解析: http://blog.csdn.net/wyj880220/article/details/7305952 Javascript ...
- 研究kisso跨域登录的心得
kisso OA所有请求都跳转到这个接口,登录只有这一个入口 http://my.web.com:8090/oa/login.ht @RequestMapping("/login.ht&qu ...
- BZOJ1798——[Ahoi2009]Seq维护序列seq
1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...