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;
}

Effect C++

Effective C++ 已经看过若干编了,里面基本都是的是C++使用最基本的准则,许多条目已经被奉为标准。最近翻看,将一些有感觉的知识点简要记录一下。 条目7:为多态基类声明virtual析构函数...
  • longhuihu
  • longhuihu
  • 2010年05月08日 21:14
  • 3630

warning:statement has no effect

直译应该是:赋值无效! 应该是给全局变量赋值了,就会出现这个问题 u_char w_cid;w_length=0x02;w_cid=0x01;w_data_buf[3]; 可以找个小例子试试...
  • kangear
  • kangear
  • 2012年10月05日 18:08
  • 11623

POJ 1135 Domino Effect

最短路问题,我用的SPFA。 求出各个点的最短时间。 然后每条边的为 (d[u]+d[v]+len)/2   len 为此边长度。 然后找时间最长的。 #include #includ...
  • dongshimou
  • dongshimou
  • 2014年07月02日 10:21
  • 512

poj 1135 Domino Effect

dijkstra算法的应用。 我的思路:先找到从第一个点出发到所有点的单源最短路,选择最长的一个。如果某两个点之间的多米诺骨牌传播时间终止点在最长的最短路时间之后,就把该点确定为所需时间。 用“pri...
  • u011385365
  • u011385365
  • 2014年01月09日 23:05
  • 1054

effect C++ 尽可能使用const

摘自《effect C++》
  • xiedaimadejudy
  • xiedaimadejudy
  • 2017年03月20日 10:02
  • 247

Directx下的Effect框架

dx11 里面的effect 还需要对手动去添加 头文件和库 最近尝试用了下Directx下的Effect框架,作为一初学者初学者,说下为什么我们要使用Effect框架及其好处吧...
  • u012325397
  • u012325397
  • 2016年02月12日 16:08
  • 425

《Effect C++》学习------基本知识

术语我觉得C++里面比较重要的基础就是一些术语。 - 首先较为重要的术语就是声明式,它是用来告诉编译器某个东西的名称和类型,但略去细节。如下面几个例子:extern int x; //对象声明式...
  • qq_19528953
  • qq_19528953
  • 2016年08月10日 10:55
  • 1079

Fixed Effect简单概念

固定效应((fixed effect)[1]  试验设计的基本概念之一试验中,若因素的水平选取已定好,该因素的水平效应作为固定参数,称此为固定效应。 固定效应((fixed effe...
  • adore1993
  • adore1993
  • 2016年11月23日 14:33
  • 1467

effect经典总结

1,C++属于一个语言联邦 : C     Object-Oriented C++     Template C++       STL 2,应尽量以const,enum,inline替换#defin...
  • shenya1314
  • shenya1314
  • 2017年02月05日 18:03
  • 316

DirectX11 Effect特效文件

Effect特效文件1. 什么是Effect特效文件? Direct3D 中,有个 Effect 文件的概念。将所创建的着色器与这些文件捆绑在一起就是所谓的一个效果(特效)。 大多数时候,你只是结...
  • sinat_24229853
  • sinat_24229853
  • 2015年09月24日 20:57
  • 1807
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1135Domino Effect
举报原因:
原因补充:

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