HDU1598——find the most comfortable road

//开始用DFS,不断超时啊( ⊙ o ⊙ )!

//贪心+并查集,对所有边排序,然后枚举每一条边,每条边的两个点合并为一个集合,当出现通路时就结束

//利用了并查集的思想,其实就是和kruskal里面的实现是一个样子,枚举加了贪心

View Code
#include <stdio.h>
#include <stdlib.h>
#define inf 9999999
#define N 1001

struct _ed
{
int s;
int e;
int l;
}ed[N];

int f[210];

int cmp(const void *a, const void *b)
{
return (*(struct _ed *)a).l - (*(struct _ed *)b).l;
}

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

int main()
{
int i, j, n, m, fx, fy, q, s, e, ans;
while(scanf("%d%d", &n, &m) != EOF)
{
for(i=0;i<m;i++)
{
scanf("%d%d%d", &ed[i].s, &ed[i].e, &ed[i].l);
}
scanf("%d", &q);
qsort(ed, m, sizeof(ed[0]), cmp);
while(q --)
{
scanf("%d%d", &s, &e);
ans = inf;
for(i=0;i<m;i++)
{
for(j=1;j<=n;j++)
{
f[j] = j;
}
for(j=i;j<m;j++)
{
fx = find(ed[j].s);
fy = find(ed[j].e);
f[fx] = fy;
if( find(s) == find(e) )
{
break;
}
}
if(j >= m)
{
break;
}
if(ans > ed[j].l - ed[i].l)
{
ans = ed[j].l - ed[i].l;
}
}
if(ans == inf)
{
printf("-1\n");
}
else
{
printf("%d\n", ans);
}
}
}
return 0;
}


posted @ 2011-11-25 20:33  1050768624  阅读(249)  评论(0编辑  收藏  举报