hdu 1598(最小生成树变形)

解题思路:这道题我一开始的思路是动规,dp_max[i][j]表示i-j的最大边,dp_min[i][j]表示i-j的最小边,可是这样会有问题,有可能最大边与最小边不在同一条路径上,这样就很麻烦了。

正解:参考了网上的思路,这里其实是最小生成树的变形。由于是最大边与最小边的差最小,可以先把所有边按从小到大排好序,接着就是kruskal的思路了,我们把边从小到大以此加入进去,如果start和end之间有通路,那么就说明找到了一条满足要求的路径了。注意,这里由于最小边暂时是未知的,我们应该还要先去枚举最小边。这道题确实是挺难想的,如果第一次接触的话。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 205;
const int inf = 0x7ffffff;
struct Edge
{
	int u,v,c;
}edge[1005];
int n,m,fa[maxn];

int find(int x)
{
	if(fa[x] == x)
		return x;
	return fa[x] = find(fa[x]);
}

void Union(int x,int y)
{
	int fx = find(x);
	int fy = find(y);
	if(fx != fy)
		fa[fy] = fx;
}

void init()
{
	for(int i = 1; i <= n; i++)
		fa[i] = i;
}

bool cmp(Edge a,Edge b)
{
	return a.c < b.c;
}

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i = 0; i < m; i++)
			scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
		sort(edge,edge+m,cmp);
		int q;
		scanf("%d",&q);
		while(q--)
		{
			int ans = inf,tmp;
			int start,end;
			scanf("%d%d",&start,&end);
			for(int i = 0; i < m; i++)
			{
				init();
				tmp = inf;
				for(int j = i; j < m; j++)
				{
					Union(edge[j].u,edge[j].v);
					if(find(start) == find(end))
					{
						tmp = edge[j].c - edge[i].c;
						break;	//注意要break,否则tmp值会越来越大
					}
				}
				ans = min(ans,tmp);
			}
			if(ans == inf) ans = -1;
			printf("%d\n",ans);
		}
	}
	return 0;
}
时间: 2024-11-13 10:12:58

hdu 1598(最小生成树变形)的相关文章

hdu 1598 (最小生成树+贪心)

Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ), 但XX星人对时间却没那么多要求.要你找出一条城市间的最舒适的路径.(SARS是双向的). In

HDU 4786 最小生成树变形 kruscal(13成都区域赛F)

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4136    Accepted Submission(s): 1283 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

HDU 4786 Fibonacci Tree 最小生成树变形

思路: 这题比赛的时候想了好久,最后队友机智的想到了. 不过那时不是我敲的,现在敲的1A. 想好就容易了. 直接把1或者0当做边的权值,然后按边从小到大排序,然后算最小生成用到了几条白边,然后再按边从大到小排序,然后再算白边用了几条.然后最小和最大需要用到的白边都算出来了.如果在这最小最大区间中存在那个啥数列的话就是Yes,否则就是No. 为什么在这区间里面就是对的呢?刚开始我也想了好久,然后发现,因为白边权值是1,然后黑边是0,然后假设用到白边最小的是6,最大的是10,那么,我们可以用黑边去替

HDU 1598 find the most comfortable road (最小生成树) &gt;&gt;

Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的"舒适度"有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ), 但XX星人对时间却没那么多要求.要你找出一条城市间的最舒适的路径.(

HDU 1598 find the most comfortable road (最小生成树)

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5897 Accepted Submission(s): 2562 Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结

POJ1789&amp;ZOJ2158--Truck History【最小生成树变形】

链接:http://poj.org/problem?id=1789 题意:卡车公司有悠久的历史,它的每一种卡车都有一个唯一的字符串来表示,长度为7,它的所有卡车(除了第一辆)都是由以前的卡车派生出来的.现在一些砖家想研究这些卡车的历史,他们定义了卡车类型编码的距离:卡车编码字符串(长度7)相同位置字符不同的个数.比如一个卡车编码是aaaaaaa,另一个是bbaaaaa,则他们的距离是2,.他们又定义了派生方案的优劣值:1/Σ(to,td)d(to,td). 其中t0为基类型,td为派生类型,d(

hdu 3371 最小生成树prim算法

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8992    Accepted Submission(s): 2519 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thoug

hdu 1598 find the most comfortable road

http://acm.hdu.edu.cn/showproblem.php?pid=1598 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 2000 5 using namespace std; 6 const int inf=1<<30; 7 8 int f[maxn],n,m,q,a,b; 9 struct node 10 { 11 int u

hdu 1301 最小生成树prim实现

http://acm.hdu.edu.cn/showproblem.php?pid=1301 Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4145    Accepted Submission(s): 3020 Problem Description The Head Elder of the tropica