[ZOJ 1298][POJ 1135] Domino Effect

使用扫频信号测量房间脉冲响应 脉冲响应的测量 阅读详情

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1298

POJ: http://poj.org/problem?id=1135


题目大意:

    有n个关键骨牌 (1 <= n < 500),m列骨牌。整个多米诺骨牌图是联通的。m列骨牌描述如下:a,b,i,表示这排骨牌是在关键骨牌a到b之间的,从一头到另一头倒下需要i秒。
    总是从n=1的骨牌开始推倒。

    输出最后倒下的骨牌的倒下时间和位置(最后倒下的是某个关键骨牌,或者某两个关键骨牌之间)


解题思路:

    首先每个key domino什么时候倒下可以抽象为一个最短路问题,可以用Dijkstra, BellmanFord或者SPFA算出每个key domino倒下的时间。

    接下来计算最后倒下骨牌的位置。由于“If you find several solutions, output only one of them.”,注意到答案可能不只一个,所以我枚举计算了

1、每条边最后倒下骨牌倒下的时间(如果边i->j,有dis[i]>dis[j]-w[i][j],说明不是从i倒到j,那么最后倒下的骨牌才是between i and j)

2、每个key domino倒下的时间

    这一步应该有更简单的方法,或者放在最短路里做,但是数据量不大,就这么乱搞了……


注意点

1、边界问题,要测试n==1的时候能不能正常输出,我因为这个WA了一次……

2、输出后加一空行

3、分情况输出的时候,加n==1的时候匆匆忙忙System # 这一行漏了一次……


源代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <limits.h>
using namespace std;
#define maxn 510

struct edge{int v,w,next;};

bool init(int g[], edge e[],int &n, int &m)
{
    scanf("%d%d", &n, &m);
    if (n==0 && m==0) return false;
    memset(g,255,sizeof(*g)*n);
    for(int i=0,j=0; i<m;i++)
    {
        int a,b,c;
        scanf("%d%d%d", &a, &b, &c);
        a--; b--;
        e[j].v=b; e[j].w=c; e[j].next=g[a]; g[a]=j++;
        e[j].v=a; e[j].w=c; e[j].next=g[b]; g[b]=j++;
    }
    return true;
}

bool bellmanford(int g[], edge e[], int n, int s, int dis[])
{
    bool u[maxn]={0};
    int q[maxn], c[maxn]={0}, h=0, d=1;
    for (int i=0; i<n; i++)
        dis[i]=INT_MAX;
    dis[s]=0; u[s]=true; q[0]=s;
    while (h!=d)
    {
        int i=q[h];
        if (++h==n+1) h=0;
        u[i]=false;
        if (c[i]++==n) return false;
        for (int j=g[i],k; j!=-1; j=e[j].next)
            if (dis[k=e[j].v]>dis[i]+e[j].w)
            {
                dis[k]=dis[i]+e[j].w;
                if (!u[k]) {u[k]=true; q[d++]=k; if(d==n+1) d=0;}
            }
    }
    return true;
}

void solve(int g[], edge e[], int cs, int n, int dis[])
{
    printf("System #%d\n", cs);
    int k=0, k1, k2;
    double time1=0.0, time2=0.0;
    //check the last falling key domino
    for (int i=1; i<n; i++)
        if (dis[i]>dis[k]) k=i;
    time1=1.0*dis[k];
    //check domino between key dominoes
    for (int i=0; i<n; i++)
        for (int j=g[i]; j!=-1; j=e[j].next)
        {
            if (dis[e[j].v]<=dis[i] && dis[e[j].v]>dis[i]-e[j].w && 1.0*(dis[e[j].v]+dis[i]+e[j].w)/2>time2)
            {
                time2=1.0*(dis[e[j].v]+dis[i]+e[j].w)/2;
                k1=(i<e[j].v)?i:e[j].v;
                k2=(i>e[j].v)?i:e[j].v;
            }
        }
    if (time1>time2)
        printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n", time1, k+1);
    else
        printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n", time2, k1+1, k2+1);
}

int main(){
    int g[maxn], dis[maxn];
    edge e[maxn*maxn];
    int n, m;
    for (int cs=1; ;cs++)
    {
        if (!init(g, e, n, m)) break;
        if (n==1)
        {
             printf("System #%d\n", cs);
             printf("The last domino falls after 0.0 seconds, at key domino 1.\n\n");
             continue;
        }
        bellmanford(g, e, n, 0, dis);
        solve(g, e, cs, n, dis);
    }
    return 0;
}


科研绘图神器Origin中文版安装后还是英文?手把手教你三步搞定界面汉化 本文详细介绍了Origin软件安装后界面仍显示英文的解决方案,包括基础语言切换、注册表修改和序列号破解三种方法。通过逐步指导,帮助用户快速实现界面汉化,提升科研绘图效率。特别针对教育版用户提供了有效的语言锁定解除方案。 阅读详情

相关推荐

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1919

zoj 1298 && poj 1135 Domino Effect

题意:本题的要求是推倒第一张关键牌后,最后倒下的牌的位置及时间。 思路: 最后倒下的牌只有两种情形:⑴最后倒下的牌就是关键牌 ⑵最后倒下的牌是两张关键牌之间的普通牌。所以我们需要判断最后到底是那种情形。 1.计算每一张关键牌倒下的时间。取最大值maxtime1。 2.计算每一行完全倒下的时间。每一行倒下的时间t = (time[i] + time[j] + edge[i][j]

mxc的专栏 403

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

ZOJ1298, POJ1135 Domino Effect

题目大意:         你的任务是编写程序,给定多米诺骨牌游戏,计算最后倒下的是哪一张骨牌、在什么时间倒下。这些多米诺骨牌游戏包含一些“关键牌”,他们之间由一行普通骨牌连接。当一张关键牌倒下时,连接这张关键牌的所有行都开始倒下。当倒下的行到达其他还没倒下的关键骨牌时,则这些关键骨牌也开始倒下,同样也使得连接到它的所有行开始倒下。每一行骨牌可以从两个端点中的任何一张关键牌开始倒下,甚至两个端点

Abner 1041

【目标跟踪】ECO算法论文阅读:ECO: Efficient Convolution Operators for Tracking

这里所指的训练集是指保存了每一帧的跟踪结果的训练集,也就是说,每一次进行model update的时候,要用在这一帧之前所有跟踪到的样本。那么随着视频越来越长,这个训练集就会越来越大。因为当目标被遮挡或者丢失的时候,比较新的这些样本本身就是错的,那么模型很容易有model drift,就是被背景或者错误的目标污染,导致跟踪结果出错。如下图所示,Baseline是传统的训练集,每更新一帧就加一个进来,那么连续的数帧后训练集里面的样本都是高度相似的,即容易遗忘前面的样本,且容易对最近的若干帧样本过拟合。

qq_43799400的博客 2610

Scratch 3.0角色控制避坑指南:为什么你的键盘移动总卡顿?

本文深入剖析了Scratch 3.0中角色移动卡顿的根本原因,指出依赖`当按下`事件积木的局限性。通过对比分析,推荐采用`重复执行`结合`如果<键被按下?>`的循环控制方案,并引入速度变量模拟惯性,从而实现流畅、实时的键盘控制优化,显著提升游戏操作体验。

dd012的博客 1013

ZOJ1298 POJ1135 Domino Effect,Dijkstra 算法

这是很简单Dijkstra算法的应用。把遍历过的顶点记录下来,每一次找到一个顶点,就把最短路径到达这个顶点的边记录下来,在最后找到所有没有记录的边,看看边上是否存在碰撞点。 这题要考虑一种情况,就是一个顶点的情况。这可是贡献了我多个WA啊~~~~~ /********

Neo Fung的专栏 787

用AI+Playwright实现零代码UI自动化测试:以登录页面为例的实战指南

本文详细介绍了如何利用AI与Playwright结合实现零代码UI自动化测试,特别以登录页面为例进行实战演示。通过自然语言描述生成测试脚本,大幅降低技术门槛,提升测试效率,并支持跨浏览器验证。适合非技术人员快速上手专业级自动化测试。

weixin_28842269的博客 401

Domino Effect ZOJ 1298 POJ 1135 Dijkstra

这题WA很久,然后找不出原因,后来看了书上的程序(图论理论算法实现及应用神马的),然后感觉不出来自己哪里错了,后来改了改,把无穷大的定义改小了点,再放到ZOJ上,成功AC了,我都不知道为什么,也许还改了其他地方,我已经糊涂了,然后又把它放POJ 1135上又WA了,我都憔悴了,最后我想起以前刷水题时要把double用%f输出,我试了一下,果然AC了,求解释````` 贴代码: View Cod...

weixin_30672295的博客 139

使用TMS320F28335控制四位共阳数码管

简要阐述利用F28335控制四位共阳数码管的整个过程,包括原理、思路、部分代码以及调试过程。

liujunhaozuishuai的博客 2658

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

Robot_PLC_HMI_Automation 4914

POJ 1135/ZOJ 1298 Domino Effect

最短路径问题   Dijkstra 题意: 有n个关键骨牌,每两个关键骨牌之间之多有一行普通骨牌,一共有m行骨牌,可以理解成有m条边。从第一张骨牌开始推到,最后一张倒下的骨牌要么是关键骨牌,要么是两张关键骨牌中的一张。 分析: 先用Dijkstra算法求出每张关键牌的最短路径,然后计算每一行倒下的时间,记录关键牌倒下的时间和位置,枚举每一行中间的普通牌倒下的

Chuck的博客 777

基于jeecgboot3.9.0的项目管理——项目工作台(二)

基于jeecgboot3.9.0的项目管理——项目工作台(二)

宁波阿成的博客 205

zoj 1298 Domino Effect (poj 1135)

Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6086 Accepted: 1546 Description Did you know that you can use domino bones for other things b...

weixin_30364147的博客 139

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TOJ 1883 ZOJ 1298 POJ 1135 Domino Effect / Dijkstra

把第一个推倒 求所有多米诺倒下的最短时间 不是每个点上有一个骨牌 是路上都有 每个点只是关键的骨牌 只有一种最优解 先求出1到各点的最短路 求最短路中的最大值 这是一个关键点的情况 在枚举每一条边 u v w 如果(d[u] + d[v] + w) / 2 > max 就更新一下 因为是要求最短路的最大值  这是2个关键点的情况 Dijkstra #include #include

嗯。 1240

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ZOJ 1298 Domino Effect(POJ1135)(最短路)

<br />我类个去啊!!!!!!!!!!!!!!<br />我类个大去啊!!!!!!!!!!!!!!!!!!<br />我类个去去去啊!!!!!!!!!!!!!!!!!!!!<br /><br /><br />有木有!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />这样的题,我WA了一晚上!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />擦啊,某人一下就过了啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br /><br /><br />还跟我说可水啊

laoda扯一扯 972

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

zoj 1298 Domino Effect || poj 1135(zoj排名第二!!泪奔!!)

纠结了昨天一下午外加晚上快睡觉前的一段时间外加今天上午的一个小时,这道最短路径的题终于AC啦!!!泪奔!!!我想想该怎么说这个算法呢。恩。这道题是寻找多米诺骨牌的最终停下的位置,从牌1开始,如果1连接条路,两条路可以同时开始倒,以后也是,如果key点连接多条路,到达key点时,连接的所有路都开始倒。我的想法是:1、用dijkstra找最短路径,从这些最短路径中寻找最长的路。2、寻找三角形。比如下面这个图(我画的哦~~)黑色数字代表key点,红色代表边长。你所需做的工作就是,从2开始找与2连接的点,距离为1到

小媛在努力~ 2380

ZOJ 1298 poj 1135 Domino Effect(最短路,dij)

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6322   Accepted: 1609 Description Did you know that you can use domino bones for other things

nealgavin的专栏 402

POJ 1135/ZOJ 1298 Domino Effect (最短路径dijkstra)

给出多米诺骨牌的节点和节点间走完需要的时间,判断从第一个节点开始,他们是怎么样全部倒完的。用dijkstra求出最短路径,遍历所有的边,若| dist[i]  - dist[j]  | 输出两个点中间结束的情况时,两个点从小到大。我的感觉:1.cout真是不好用  2.最近狂掉人品中,勿扰。。,,#include #include #include #include using namespace std; const int INF = 9999999; int main() { int

闷瓜蛋子的专栏 1009

[ZOJ1413][POJ1021] 2D Nim 非人品解法

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1413POJ: http://poj.org/problem?id=1021题目大意:其实和Nim问题是没有关系的。给出两个玩2D-Nim游戏的棋

Dango's happy life 1570

[ZOJ1144][POJ1104] Robbery

ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1144POJ:http://poj.org/problem?id=1104题目大意:有大盗光顾了一个W*H的矩形城市。给出一些信息,t时刻大盗不在矩

Dango's happy life 1400

[ZOJ1462][POJ1112] Team Them Up!

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=462POJ: http://poj.org/problem?id=1112题目大意:把一些人分成两组,每一组中的人满足任意两个人都相互认识,且要求两组

Dango's happy life 1265

[ZOJ 1116 ] [ POJ 1911 ] A Well-Formed Problem

ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1116题目大意:(对XML没有了解,只是按照字面意思理解了一下题意)与这样有起始结束声明的,name称为tag是empty el

Dango's happy life 1233

[ZOJ1021] The Willy Memorial Program

【题目大意】有一些竖直的圆筒状管子,管子间有理想的水平细管相连。一只蜘蛛停在某跟管子的某个高度上,从第一根管子往系统注水,问前往营救的老鼠有多长时间可以关闭热水阀门。    最终抽象为当水上升到指定位置的时候系统中的总水柱高度。 【解题思路】 AC思路:(参考“狗狗40题搞完纪念“)从第一根管子开始注水,采用优先队列的方式每次选取可注水且纵坐标最大(最低)的地方进行注水。若中途出现溢出现象,则永远

Dango's happy life 1190

[ZOJ1518][POJ1291] This Sentence is False

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1518POJ: http://poj.org/problem?id=1291题目大意:有n个句子,编号为1..n,为Sentence XXX is

Dango's happy life 1176

[ZOJ1391][POJ1436] Horizontally Visible Segments

题目大意:若两条竖直线段之间可以连一条水平线,这条水平线不与其他竖直线段相交,称这两条竖直线段为“相互可见”的。若存在三条竖直线段,两两”相互可见“,则构成”线段三角形“。给出一些竖直的线段,问一共有多少”线段三角形“解题思路:这道题在刘汝佳的黑书里有解题思路的指导,在图论部分出

Dango's happy life 1134
上一篇: [转]matlab的Virtual Reality(虚拟现实)工具箱的应用简介
下一篇: [ZOJ 1387] [POJ 1432] Decoding Morse Sequences
program_shun
博客等级 码龄17年 10粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值