POJ 1135Domino Effect

原创 2012年03月29日 12:47:01

题目链接:http://poj.org/problem?id=1135

            就是一个单源最短路问题,从编号为1的骨牌开始,按最短路依次倒下,求最后一个骨牌倒下需要多长时间,当求完最短路后,所有点中的最长时间也不一定是所求结果,我们把所求的最短路放在dis[MAX]数组中,如果编号为 i 的 结点不是出度为零的结点,那么它还要继续倒,我们可以枚举每条边,如果两个相邻结点倒的过程中在路径上相碰,那么相碰那一刻所用的时间就是这条路径的最长时间 t,最大的 t 就是结果,可能说不太清楚,比如i,j两个结点有边,权值为w(i,j),并且i 所得的最短路不是从j点来的,j点也不是从i点来的,这两个结点的骨牌会在i,j这条边上相碰,如果abs(dis[i] - dis[j]) > w(i,j) 就可以直接放弃这个情况了(可以想想为什么,因为这样他们就不会再边上碰了),反之t = (dis[i]+dis[j]+w(i,j)) / 2.0; 枚举完所有边就可求出结果,注意只有一个牌的时候输出0.0,不需要时间。(说不清楚。。。。)参考代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;

#define MAX 505
#define CLR(arr,v) memset(arr,v,sizeof(arr))

struct point
{
	int v,d;
	friend bool operator<(point a,point b)
	{
		return a.d > b.d;
	}
}mid;
int dis[MAX],h[MAX],nex[MAX*MAX],val[MAX*MAX],des[MAX*MAX],pre[MAX],pos;
bool vis[MAX];
priority_queue<point> q;

void init()
{
	pos = 0;
	CLR(pre,0);CLR(vis,0);
	CLR(h,0);  CLR(nex,0);
	CLR(val,0);CLR(des,0);
	fill(dis,dis+MAX,INT_MAX);
	while(!q.empty()) q.pop();
}

void add(int u,int v,int d)
{
	val[++pos] = d;
	des[pos] = v;
	nex[pos] = h[u];
	h[u] = pos;
}

void dijkstra(int n)
{
	dis[1] = 0;
	mid.v = 1;  mid.d = 0;
	pre[1] = 0; q.push(mid);
	for(int i = 0;i < n;++i)
	{
		while( !q.empty() && vis[q.top().v]) q.pop();
		if(q.empty()) break;
		vis[q.top().v] = true;
		int p = q.top().v,d = q.top().d;
		q.pop();
		for(int j = h[p]; j ;j = nex[j])
		{
			if(!vis[ des[j] ] && (dis[ des[j] ] == INT_MAX || dis[p] + val[j] < dis[ des[j] ]))
			{
				dis[ des[j] ] = dis[p] + val[j];
				mid.v = des[j];
				mid.d = dis[ des[j] ];
				q.push(mid);
				pre[ des[j] ] = p;
			}
		}
	}
}

int main()
{
	int m,n,k = 1;
	while(~scanf("%d%d",&n,&m) && m + n)
	{
		init();
		int u,v,d;
		for(int i = 0;i < m;++i)
		{
			scanf("%d%d%d",&u,&v,&d);
			add(u,v,d);
			add(v,u,d);
		}
		dijkstra(n);
		double res = -1;
		int p1,p2;
		for(int i = 1;i <= n;++i)
		{
			if(res < dis[i])
			{
				res = dis[i];
				p1 = p2 = i;
			}
			for(int j = h[i]; j ;j = nex[j])
			{
				if(pre[i] == des[j] || pre[ des[j] ] == i)
					continue;
				if(abs(dis[i] - dis[ des[j] ]) >= val[j])
					continue;
				v = des[j];
				d = val[j];
				double num = (dis[i] + dis[ des[j] ] + d) / 2.0;
				if(res <= num)
				{
					res = num;
					p1 = i < des[j]?i:des[j];
					p2 = i > des[j]?i:des[j];
				}
			}
		}
		printf("System #%d\n",k++);
		printf("The last domino falls after %.1lf seconds, ",res);
		if(p1 == p2) 
			printf("at key domino %d.\n\n",p1);
		else
			printf("between key dominoes %d and %d.\n\n",p1,p2);
	}
	return 0;
}

相关文章推荐

POJ 1135 Domino Effect 最短路

Description Did you know that you can use domino bones for other things besides playing Dominoes? T...
  • AXuan_K
  • AXuan_K
  • 2014年09月15日 21:35
  • 516

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

题意   题目描述:  你知道多米诺骨牌除了用来玩多米诺骨牌游戏外,还有其他用途吗?多米诺骨牌游戏:取一 些多米诺骨牌,竖着排成连续的一行,两张骨牌之间只有很短的空隙。如果排列得很好,当你推 倒第 1...
  • acvay
  • acvay
  • 2014年10月26日 21:34
  • 1158

poj 1135 Domino Effect 最短路

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8711   ...

[ZOJ 1298][POJ 1135] Domino Effect

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1298POJ: http://poj.org/problem?id...

POJ 1135 Domino Effect (spfa + 枚举)- from lanshui_Yang

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

POJ-1135-Domino Effect

求最短路径题,最后需要进行一个特殊的判断 代码: #include #include #include #include #include #define MAX 430001 using nam...

poj 1135 Domino Effect(最短路+枚举)

http://poj.org/problem?id=1135 经过无数的WA和PE终于AC。。 最短路的模板。 1)dis[i]表示i到源点1的最短路径,代表每一张关键牌倒下的时间,并求出最大的...

POJ-1135 Domino Effect

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Description Did you kno...

POJ-1135-Domino Effect(迪杰斯特拉)

Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10713 Accepte...

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

题意:有一堆多米诺骨牌,其中有n个关键牌,起到连接的作用,某些关键牌之间有一串普通牌,推倒用,推倒有一定时间消耗,每次都从第一个关键牌开始推,问推倒需要多少时间。 结果有两种可能的情况:第一种是最后...
  • zzzz40
  • zzzz40
  • 2014年07月26日 21:23
  • 599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1135Domino Effect
举报原因:
原因补充:

(最多只允许输入30个字)