POJ1135比较有意思的对短路(多米骨牌)
题意:
有一个骨牌游戏,就是推到一个后所有的牌都会被退到的那种游戏,起点是1,有两种骨牌,一种是关键牌,另一种是普通牌,普通牌是连接关键牌用的,给你一些边a b c的意思是关键牌a倒之后c时间b会被a的效应影响到,被推倒,然后问题是求出所有牌被都被推倒的时间,还有最后倒的牌处在的位置(两种情况,处在某一个关键牌上,处在某一条关键牌之间)。
思路:
可以用spfa或者是bfs啥的来做,我用的是spfa跑一遍最短路,跑完之后把所有到1节点的距离的最大的那个拿出来a,这个值有什么用?想下,假如最后倒下的骨牌是一个关键骨牌,那么是不是倒下的时间是这个值,到小的牌就是这个点,那么其他情况呢?也很好解决,我的想法是标记所有最短路上的边(不是单独一条路径,可以充当最短路上的边的边都行),那么这些边肯定可以再a时间内到达,其他的边就不一定了,所有枚举所有非最短路边,然后算出如果在当前路径上相遇的时间会是多少?边a b c 的话相遇时间是(dis[a]+dis[b]+c)
/ 2,如果比最短路的最长那个值还大,那么就更新最优,并且记录当前的这两个端点ab,如果所有的非最短路上的边,都没有更新值,也就是时间都比一开始那个最短的最长小,那么最后就是落在了唯一的一个特殊牌上了,具体细节可以看下下面代码。
#include<queue>
#include<stdio.h>
#include<string.h>
#define N_node 500 + 5
#define N_edge 500000 + 100
#define INF 1000000000
using namespace std;
typedef struct
{
int to ,next ,cost;
}STAR;
typedef struct
{
int a ,b ,c;
}EDGE;
STAR E[N_edge];
EDGE edge[N_edge];
int list[N_node] ,tot;
int s_x[N_node] ,mark[N_node];
void add(int a ,int b ,int c)
{
E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot;
}
void Spfa(int s ,int n)
{
memset(mark ,0 ,sizeof(mark));
for(int i = 0 ;i <= n ;i ++)
s_x[i] = INF;
queue<int>q;
q.push(s);
mark[s] = 1;
s_x[s] = 0;
while(!q.empty())
{
int xin ,tou;
tou = q.front();
q.pop();
mark[tou] = 0;
for(int k = list[tou] ;k ;k = E[k].next)
{
xin = E[k].to;
if(s_x[xin] > s_x[tou] + E[k].cost)
{
s_x[xin] = s_x[tou] + E[k].cost;
if(!mark[xin])
{
mark[xin] = 1;
q.push(xin);
}
}
}
}
return ;
}
int main ()
{
int n ,m ,a ,b ,c ,i;
int cas = 1;
while(~scanf("%d %d" ,&n ,&m) && n + m)
{
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d %d" ,&a ,&b ,&c);
add(a ,b ,c);
add(b ,a ,c);
edge[i].a = a;
edge[i].b = b;
edge[i].c = c;
}
printf("System #%d\n" ,cas ++);
if(n == 1 && m == 0)
{
printf("The last domino falls after 0.0 seconds, at key domino 1.\n\n");
continue;
}
Spfa(1 ,n);
double time = 0 ,maxt = 0;
int maxid;
for(i = 2 ;i <= n ;i ++)
{
if(maxt < s_x[i])
{
maxt = s_x[i] * 1.0;
maxid = i;
}
}
time = maxt;
int aa = 0 ,bb = 0;
for(i = 1 ;i <= m ;i ++)
{
a = edge[i].a ,b = edge[i].b ,c = edge[i].c;
if(s_x[a] + c != s_x[b] && s_x[b] + c != s_x[a])
{
double tmp = (s_x[a] + s_x[b] + c) / 2.0;
if(time < tmp)
{
time = tmp;
aa = a ,bb = b;
}
}
}
printf("The last domino falls after %.1lf seconds, " ,time);
a = aa < bb ? aa : bb;
b = aa > bb ? aa : bb;
if(maxt == time) printf("at key domino %d.\n\n" ,maxid);
else printf("between key dominoes %d and %d.\n\n" ,a ,b);
}
return 0;
}
POJ1135比较有意思的对短路(多米骨牌)的更多相关文章
- Gym - 101291C (很有意思的最短路)
题意: 给出一张地图和机器人还有出口的位置,地图上面有障碍.然后给出UDLR上下左右四种指令,遇到障碍物或者越界的指令会忽略,剩下的继续执行. 只要到达出口就算找到出口,然后给你一串指令,让你修改指令 ...
- 省选训练赛第4场D题(多米诺骨牌)
题目来自FZU2163 多米诺骨牌 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description Vasya很喜欢排多米诺 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 数学归纳法·Fibonacci数列
数学归纳法 我们先来看一个例子: 我们让多诺米骨牌倒下的充要条件是: 第一块骨牌倒下: 假设当当前块骨牌倒下时,则他的后面一块也会倒下. 我们把这个例子给抽象出来就可以得到数学归纳法的证明过程: [第 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- POJ-1135 Domino Effect---最短路Dijk
题目链接: https://vjudge.net/problem/POJ-1135 题目大意: 有N个关键的多米诺骨牌,这些牌通过一些路径相连接,这些路径是由一排其他骨牌构成的.已知每一条路径上的骨牌 ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- 软件产品案例分析--K米
软件产品案例分析--K米 第一部分 调研,评测 评测 个人第一次上手体验 使用的第一款点歌软件,以为就是个遥控而已,使用后发现功能还挺多,能点挺久.觉得很方便,不用挤成一堆点歌了.K米的脸蛋(UI)好 ...
- hdu1071(抛物线弓形面积阿基米德算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...
随机推荐
- 使用当前主流的github管理项目代码(记我的第一次项目创建)
先创建一个github的账号 网址:https://github.com/ 然后下载一个git工具并安装 网址:https://gitforwindows.org/ 下载安装注册完成后, 创建一个新的 ...
- rest framework Genericview
通用视图 Django的通用视图...被开发为普通使用模式的快捷方式......他们采取某些共同的习惯和模式的发展观和抽象,从而使您可以快速地将数据写入的共同看法,而不必重复自己发现的. - Djan ...
- 下载微软pdb符号文件
使用symchk.exe 逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...
- 为什么数据库字段要使用NOT NULL?
最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来说,简直难以忍受,因此有了这篇文章. 基于目前大部分的开发现状来说,我们都会把字段全部设置成NOT ...
- 经常问到的 BFC 和 IFC 是什么?
什么是BFC?什么作用? Block Formatting Context 块盒子布局发生的区域,浮动元素和其他元素交互的区域 浮动定位和清除浮动的时候只会应用于同一个BFC内的元素.浮动不会影响其他 ...
- 带你全面认识CMMI V2.0(一)
新发布的CMMI V2.0在方法论和方法上都提出了一些战略上的变化和改进.这些更新提供了新的要求.历史标准的演进以及以往实践的延续. CMMI V2.0和CMMI V1.3的变化 CMMIV2.0的定 ...
- 如何快速在odoo中创建自己的菜单
上一篇内容:如何快速创建odoo模块,使用脚手架快速创建自己的odoo应用app 前言 在上一个教程中,我们已经实现了对模块的创建,现在我们要对创建的模块添加内容,这个教程将教你如何在odoo菜单中创 ...
- 201871010130-周学铭 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18卓越班 这个作业要求链接 实验三结对编程要求 我的课程学习目标 体验软件项目开发中的两人合作,练习结对编程(Pair programming).掌握Github协作开 ...
- 这样介绍Ribbon,从此任何问题也难不住你
Springcloud的核心组件之Ribbon 上篇文章详细介绍了springcloud的注册中心Eureka,那么这篇文章则会介绍springcloud的另外一个组件Spring Cloud Rib ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10 欢迎加QQ群:1026880196 进行交流学习 实例类型 #controller1 ...