题意:

     有一个骨牌游戏,就是推到一个后所有的牌都会被退到的那种游戏,起点是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比较有意思的对短路(多米骨牌)的更多相关文章

  1. Gym - 101291C (很有意思的最短路)

    题意: 给出一张地图和机器人还有出口的位置,地图上面有障碍.然后给出UDLR上下左右四种指令,遇到障碍物或者越界的指令会忽略,剩下的继续执行. 只要到达出口就算找到出口,然后给你一串指令,让你修改指令 ...

  2. 省选训练赛第4场D题(多米诺骨牌)

    题目来自FZU2163 多米诺骨牌 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Vasya很喜欢排多米诺 ...

  3. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  4. 数学归纳法·Fibonacci数列

    数学归纳法 我们先来看一个例子: 我们让多诺米骨牌倒下的充要条件是: 第一块骨牌倒下: 假设当当前块骨牌倒下时,则他的后面一块也会倒下. 我们把这个例子给抽象出来就可以得到数学归纳法的证明过程: [第 ...

  5. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  6. POJ-1135 Domino Effect---最短路Dijk

    题目链接: https://vjudge.net/problem/POJ-1135 题目大意: 有N个关键的多米诺骨牌,这些牌通过一些路径相连接,这些路径是由一排其他骨牌构成的.已知每一条路径上的骨牌 ...

  7. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  8. 软件产品案例分析--K米

    软件产品案例分析--K米 第一部分 调研,评测 评测 个人第一次上手体验 使用的第一款点歌软件,以为就是个遥控而已,使用后发现功能还挺多,能点挺久.觉得很方便,不用挤成一堆点歌了.K米的脸蛋(UI)好 ...

  9. hdu1071(抛物线弓形面积阿基米德算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...

随机推荐

  1. 关于redis缓存数据库的一些思考

    今晚无聊,躺在床上,在刷技术文章时,看见了一篇关于redis缓存的文章 写的蛮好,这也就引起了我对于redis思考! 不如往深了说 引起了我对于追求探索技术本质的一些思考 平时在网上刷到很多关于red ...

  2. Android R 新特性分析及适配指南

    Android R(Android 11 API 30)于2020年9月9日正式发布,随国内各终端厂商在售Android设备的版本更新升级,应用软件对Android R 版本的兼容适配已迫在眉睫. 对 ...

  3. python常见的错误异常

    1.AssertionError 该异常在assert()语句运行失败时输出 2.AttributeError 该异常在参考或设置属性失败时输出 eg:class Gs: pass g = Gs() ...

  4. IPFS矿池集群方案详解

    IPFS作为一项分布式存储技术,可以说是web3.0发展的基石.关于IPFS的产业,如存储.技术.矿机.矿池等也发展得非常迅速. 什么是单机挖矿? 单机挖矿就是一台机器就是一个节点,一台机器就完成挖矿 ...

  5. P1014_Cantor表 (JAVA语言)

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/11/1 , 1/21/2 , 1/31/3 , 1/41/4, 1/51/ ...

  6. 《逆向工程核心原理》——IAThook

    hook逻辑写入dll中,注入dll. #include "pch.h" #include <tchar.h> #include "windows.h&quo ...

  7. Git基本操作流程

    技术背景 Gitee是一款国内的git托管服务,对于国内用户较为友好,用户可以访问Gitee地址来创建自己的帐号和项目,并托管在Gitee平台上.既然是git的托管服务,那我们就可以先看看git的一些 ...

  8. python中数组切片[:,i] [i:j:k] [:-i] [i,j,:k]

    逗号","分隔各个维度,":"表示各个维度内的切片,只有:表示取这个维度的全部值,举例说明如下 1 1.二维数组 2 3 X[:,0]取所有行的第0个数据,第二 ...

  9. 【C++】 C++知识点总结

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14643010.html 目录 前言 一.C++常用后缀 二.头文件 1.C++输入输出 2.在C++中使用C的库 ...

  10. 如何快速创建odoo模块,使用脚手架快速创建自己的odoo应用app

    上一篇内容:如何快速搭建自己的ERP系统,4步源码快速安装odoo教程 了解什么是odoo的插件模块 odoo在基础的框架代码之下,可以安装自己的应用程序或者业务逻辑,也可以对原有的模块进行二次修改 ...