POJ1135&&ZOJ1298--Domino Effect【dijkstra+枚举】

题意:有一堆多米诺骨牌,其中有n个关键牌,起到连接的作用,某些关键牌之间有一串普通牌,推倒用,推倒有一定时间消耗,每次都从第一个关键牌开始推,问推倒需要多少时间。

结果有两种可能的情况:第一种是最后一个倒下的是一个关键牌。第二种是最后一个倒下的是两个关键牌之间的一个普通牌,不一定是正中间的那个,不过题目只需要输出关键牌或者两个关键牌之间,第二种情况不需要知道具体的牌时哪个。

思路:dijkstra处理,之后在dist数组中找到最大的点,如果最后一个倒下的是关键牌,则这个就是所需的时间ans1。

查找每个( dist [ i ] + dist [ j ] + edge [ i ] [ j ]  ) / 2 的值,取其中最大,存入ans2。

比较ans1和ans2 较大的那个是需要的时间。

这题还有一个坑,就是 输入 1  0  的情况,得输出时间0 和关键牌1 。

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 510
#define eps 1e-7
#define INF 0x7FFFFFFF
#define long long ll;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

int edge[MAXN][MAXN];
int vis[MAXN];
int dist[MAXN];
int n,m;
void dijkstra(int v){
    int i,j;
    for(i=1;i<=n;i++){
        dist[i] = edge[v][i];
    }
    vis[v] = 1;
    for(i=0;i<n-1;i++){
        int k = -1,temp = INF;
        for(j=1;j<=n;j++){
            if(!vis[j]&&dist[j]<temp){
                temp = dist[j];
                k = j;
            }
        }
        if(k==-1)   break;
        vis[k] = 1;
        for(j=1;j<=n;j++){
            if(!vis[j]&&edge[k][j]!=INF&&dist[j]>dist[k]+edge[k][j])
                dist[j] = dist[k] + edge[k][j];
        }
    }
}
int main(){
    int i,j,a,b,c,pos,pos1,pos2,k = 1;
    double ans1,ans2;
    while(scanf("%d%d",&n,&m),n||m){
        memset(vis,0,sizeof(vis));
        for(i=0;i<=n;i++){
            for(j=0;j<=n;j++){
                edge[i][j] = INF;
            }
            edge[i][i] = 0;
        }
        for(i=0;i<m;i++){
            scanf("%d%d%d",&a,&b,&c);
            edge[a][b] = edge[b][a] = c;
        }
        dijkstra(1);
        ans1 = 0;
        ans2 = 0;
        pos = pos1 = pos2 = 1;
        for(i=1;i<=n;i++){
            if(dist[i]!=INF&&dist[i]>ans1){
                ans1 = dist[i];
                pos = i;
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                double tt = (dist[i]+dist[j]+edge[i][j])/2.0;
                if(edge[i][j]!=INF&&tt>ans2){
                    ans2 = tt;
                    pos1 = i;
                    pos2 = j;
                }
            }
        }
        printf("System #%d\n",k++);
        if(ans1>=ans2){
            printf("The last domino falls after %.1lf seconds, at key domino %d.\n",ans1,pos);
        }
        else{
            printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n",ans2,pos1,pos2);
        }
        printf("\n");
    }
    return 0;
}

/*
5 7
1 2 1
1 3 2
1 4 3
1 5 5
2 3 1
3 4 1
4 5 1
*/
时间: 2024-10-13 14:23:09

POJ1135&&ZOJ1298--Domino Effect【dijkstra+枚举】的相关文章

POJ 1135 Domino Effect (Dijkstra 最短路)

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9335   Accepted: 2325 Description Did you know that you can use domino bones for other things besides playing Dominoes? Take a number of dominoes and build a row by standing t

POJ 1135 Domino Effect(最短路 多米诺骨牌)

题意 题目描述: 你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙.如果排列得很好,当你推 倒第 1张骨牌,会使其他骨牌连续地倒下(这就是短语"多米诺效应"的由来). 然而当骨牌数量很少时,这种玩法就没多大意思了,所以一些人在 80 年代早期开创了另一个 极端的多米诺骨牌游戏:用上百万张不同颜色.不同材料的骨牌拼成一幅复杂的图案.他们开创 了一种流行的艺术.在这种骨牌游戏中,通常有多行骨牌同时

POJ 1135.Domino Effect

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10325   Accepted: 2560 Description Did you know that you can use domino bones for other things besides playing Dominoes? Take a number of dominoes and build a row by standing

poj 1135 Domino Effect (dijkratra算法)

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8848   Accepted: 2210 Description Did you know that you can use domino bones for other things besides playing Dominoes? Take a number of dominoes and build a row by standing t

POJ1135 Domino Effect(SPFA)

题目大概是,普通骨牌连接两张关键骨牌,一旦一张关键骨牌倒下与其相邻的普通骨牌也倒下,普通骨牌倒下与其相邻的骨牌也倒下.给出所有有普通骨牌相连的两个关键骨牌之间普通骨牌倒下所需时间,问1号关键骨牌开始倒下后最后一张骨牌倒下的时间和位置. 居然是最短路..记dist[u]为起点骨牌1到关键骨牌u的最短时间,跑个单源最短路可得出.最后倒下的骨牌,有两种情况: 倒下的是关键骨牌u,那么倒下的时间就是dist[u] 倒下的是关键骨牌u和v之间某张普通骨牌,那么倒下的时间就是 (dist[u]+dist[v

POJ 1062 dijkstra + 枚举

这题从下午七点做到晚上的九点半,才做出来. 题意,有一个人A,要去人B那里买东西,人B说了一个价格,然后说如果你能把人C的东西弄来,再加上一部分钱(比直接买人B东西的价格少),也能买到. 于是人A又去了人C那里,人C说了同上的话.依次类推. 但是这个交易圈子里有个规定,就是每个人都有一个等级,如果两个人相差k个等级以上,是不能产生直接或者间接交易的. 问最后你一定要买到人A的东西,最少要多少钱. 分析,分析过后,可以通过交易关系,A需要B的东西,将一条边由B连上A,建立有向图.如果没有等级制度,

POJ 1135 Domino Effect(最短路径)

题意有m排放置好的多米诺骨牌,每排的头尾骨牌称为“关键骨牌”,共有n个关键骨牌,每排多米诺倒下需要L秒,关键骨牌倒下的时间忽略不计.推倒关键骨牌1,求最后一个骨牌倒下的时间及位置.(若最后一个倒下的骨牌不是关键骨牌,则按升序输出这个骨牌所在的那一排的两端的关键骨牌) 样例输入2 11 2 273 31 2 51 3 52 3 50 0 样例输出System #1The last domino falls after 27.0 seconds, at key domino 2. System #2

昂贵的聘礼 - poj 1062 (Dijkstra+枚举)

Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39976   Accepted: 11596 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了.

POJ1062 昂贵的聘礼 Dijkstra+枚举

http://poj.org/problem?id=1062 题目抽象 一张n个节点的带权有向图,每个节点都有一个值,问从各个点出发,到达0节点的最短路加上出发点的值的最小值是多少?(从0节点出发直接算作0号节点的值) 并且其中每个节点都有一个等级,在一条合法的最短路上不允许出现两个节点等级差大于给定值limit. 思路 弄了好久的题.和一般的最短路的区别是有一个limit限制.所以我们可以枚举最小等级,让每个节点的等级都试一下最小等级,然后再求最短路. 注意Dijkstra需要让不存在的边变成