zoukankan      html  css  js  c++  java
  • POJ 1135 Domino Effect(Dijkstra)

    点我看题目

    题意 : 一个新的多米诺骨牌游戏,就是这个多米诺骨中有许多关键牌,他们之间由一行普通的骨牌相连接,当一张关键牌倒下的时候,连接这个关键牌的每一行都会倒下,当倒下的行到达没有倒下的关键牌时,这个关键牌也会倒下,然后与这个关键牌相连接的所有行都会倒下,每一行有两个端点也就是两个关键牌,可以从任意一个端点开始倒下,也可以从两个端点同时开始倒下,从第一张骨牌开始倒,最后倒下的牌的位置以及时间。

    思路 : 先利用Dijkstra求出每张关键牌倒下的时间time[i],即求出第一张关键牌到其他关键牌的最短路径,然后求出众最短路径中最大的那个,即为time1。再计算每一行倒下的时间,每一行的两个关键牌的位置设为i,j,则这一行倒下的时间为(time[i]+time[j]+Edge[i][j])/2.0,找到最大值即为time2。求出time1,time2的最大值,即为我们所求。

    因为最后那个%.1lf的问题还错了一遍,交C++即可。

    //Domino Effect
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <algorithm>
    
    using namespace std ;
    
    const int INF = 999999999 ;
    const int maxn = 510 ;
    int n, m;
    int Edge[maxn][maxn] ;
    bool vis[maxn] ;
    int timee[maxn] ;
    
    
    void dijkstra()
    {
        for(int i = 1 ; i <= n ; i++)
        {
            timee[i] = Edge[1][i] ;
            vis[i] = false ;
        }
        timee[1] = 0 ;
        vis[1] = true ;
        for(int i = 1 ; i < n ; i++)
        {
            int minn = INF , u = 0 ;
            for(int j = 1 ; j <= n ; j++)
            {
                if(!vis[j] && timee[j] < minn)
                {
                    u = j ;
                    minn = timee[j] ;
                }
            }
            vis[u] = true ;
            for(int k = 1 ; k <= n ; k++)
            {
                if(!vis[k] && Edge[u][k] < INF && timee[u] + Edge[u][k] < timee[k])
                    timee[k] = timee[u] + Edge[u][k] ;
            }
        }
        double time1 = -999999999.0 ;
        int flag ;
        for(int i = 1 ; i <= n ; i++)
        {
            if(timee[i] > time1)
                time1 = timee[i],flag = i ;
        }
        double time2 = -9999999999.0 ;
        int pos1,pos2 ;
        for(int i = 1 ; i <= n ; i++)
        {
            for(int j = 1 ; j <= n ; j++)
            {
                double temp = (timee[i] + timee[j] + Edge[i][j])/2.0 ;
                if(Edge[i][j] < INF && temp > time2)
                {
                    time2 = temp ;
                    pos1 = i ;
                    pos2 = j ;
                }
            }
        }
        if(time1 < time2)
            printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.
    
    ",time2,pos1,pos2) ;
        else
            printf("The last domino falls after %.1lf seconds, at key domino %d.
    
    ",time1,flag) ;
    }
    int main()
    {
        int cas = 1 ;
        while(~scanf("%d %d",&n,&m))
        {
            if(n == 0 && m == 0)
                break ;
            int u,v ,w ;
            for(int i = 1 ; i <= n ; i++)
                for(int j = 1 ; j <= n ; j++)
                    Edge[i][j] = INF ;
            for(int i = 0 ; i < m ; i++)
            {
                scanf("%d %d %d",&u,&v,&w) ;
                Edge[u][v] = w ;
                Edge[v][u] = w ;
            }
            printf("System #%d
    ",cas++) ;
            dijkstra() ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    在Spring中使用cache(EhCache的对象缓存和页面缓存)
    halcon 模板匹配 -- 转化 vector_angle_to_rigid
    halcon 模板匹配 -- find_shape_model
    halcon 模板匹配 -- create_shape_model
    C#快速获取指定网页源码的几种方式,并通过字符串截取函数 或 正则 取指定内容(IP)
    C# Socket通讯 本机多网卡,指定网卡通讯
    C# 获取所有网卡信息
    C#关闭退出线程的几种方法
    C#多线程方法 可传参
    C# Datetime 使用详解
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3621011.html
Copyright © 2011-2022 走看看