问题描述
试题编号: | 201703-4 |
试题名称: | 地铁修建 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描: | 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。 输入格式 输入的第一行包含两个整数n, m,用一个空格分隔,分别表示交通枢纽的数量和候选隧道的数量。 输出格式 输出一个整数,修建整条地铁线路最少需要的天数。 样例输入 6 6 样例输出 6 样例说明 可以修建的线路有两种。 评测用例规模与约定 对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 20;
超时。。。。。。。。。#include<stdio.h> 更新后,使用快速查法,解决超时问题: |
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *i,const void *j);
long parent(long x);
#define MAX 200009
long n,m,ass[100002];
struct node//定义结构体存数据
{
long a,b,c;
}ss[MAX],temp;
long parent(long x)//寻找根节点
{
if(ass[x]==x)
return x;
return parent(ass[x]);
}
int cmp(const void *i,const void *j)//快速排序的比较函数
{
return(((struct node*)i)->c-((struct node*)j)->c);
}
int main()
{
long i;
scanf("%ld%ld",&n,&m);
for(i=0;i<m;i++)
scanf("%ld%ld%ld",&ss[i].a,&ss[i].b,&ss[i].c);
qsort(ss,m,sizeof(ss[0]),cmp);//将结构体有小到大排序,便于使用最小生成树
for(i=1;i<n+1;i++)//并查集初始化,每个节点都是根节点
ass[i]=i;
for(i=0;i<m;i++)//最小生成树
{
ass[ss[i].a]=parent(ss[i].a);//压缩节点
ass[ss[i].b]=parent(ss[i].b);//压缩节点
if(ass[ss[i].a]!=ass[ss[i].b])//判断两节点是否连接
{
ass[ass[ss[i].a]]=ss[i].b;//将两节点连起来
}
if(ss[i].c>ss[0].c)//选取最大的时间
ss[0].c=ss[i].c;
ass[1]=parent(1);
ass[n]=parent(n);
if(ass[1]==ass[n])//看1和n是否连接
break;
}
printf("%d",ss[0].c);
return(0);
}