Vijos p1190 繁忙的都市

7 篇文章 0 订阅
3 篇文章 0 订阅

Wish everything has changed.

题目如下

描述

城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:
1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。
2.在满足要求1的情况下,改造的道路尽量少。
3.在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。
任务:作为市规划局的你,应当作出最佳的决策,选择那些道路应当被修建。

格式

输入格式

第一行有两个整数n,m表示城市有n个交叉路口,m条道路。接下来m行是对每条道路的描述,u, v, c表示交叉路口u和v之间有道路相连,分值为c。(1≤n≤300,1≤c≤10000)
输出格式

两个整数s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。
样例1
样例输入1

4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8
样例输出1

3 6
限制
每个测试点1s
来源
Vijos 题库
NOI2005四川省选拔赛第二试第3题

题目分析

根据题意不难分析出选取的道路为n-1条,因为将n个点连成一颗树则需要n-1条边。

然后对于最大边权最小则应为最小生成树的最大边权

  • 最小生成树得到的方法是基于贪心,每次都选取能够选取的最小的一条边连接
  • 若不为最小生成树,那么必然是将最小生成树中的某些边替换掉,由此可以得出换掉的边若比最小生成树的最大边权小则不影响最大边权的值,若换掉的

比最大边权大肯定不是最大边权最小且导致权值和增加
- 由上两步分析可以得出思路为构造出一颗最小生成树,输出其最大边权。

代码入下

program p1190;
type rec=record
      s,e,v:longint;
     end;
var n,m:longint;
    ans,i,j,k:longint;
    father:array[1..300] of integer;
    map:array[1..90000] of rec;

function max(a,b:longint):longint;
begin
 if a>b then exit(a);
 exit(b);
end;

procedure qsort(i,j:longint);
var l,r,mid:longint;
    temp:rec;
begin
 l:=i;
 r:=j;
 mid:=map[(l+r)>>1].v;
 while l<=r do
  begin
   while map[l].v<mid do inc(l);
   while map[r].v>mid do dec(r);
   if l<=r
    then
     begin
      temp:=map[l];
      map[l]:=map[r];
      map[r]:=temp;
      inc(l);
      dec(r);
     end;
  end;
 if l<j then qsort(l,j);
 if i<r then qsort(i,r);
end;

function find(x:longint):longint;
begin
 if father[x]=x then exit(x);
 father[x]:=find(father[x]);
 exit(father[x]);
end;

procedure unite(a,b:longint);
begin
 father[find(father[a])]:=find(father[b]);
end;
begin
 readln(n,m);
 for i:=1 to m do
  begin
   readln(map[i].s,map[i].e,map[i].v);
   map[i+m].s:=map[i].e;
   map[i+m].e:=map[i].s;
   map[i+m].v:=map[i].v;
  end;
 qsort(1,2*m);
 for i:=1 to n do father[i]:=i;
 for i:=1 to 2*m do
  begin
   if find(map[i].s)<>find(map[i].e)
    then
     begin
      unite(map[i].s,map[i].e);
      ans:=max(ans,map[i].v);
     end;
  end;
 write(n-1,' ',ans);
end.
附上评测地址

vijos p1190

每日一句

呃呃,今天貌似两句了。。。不要在意这些细节,O(∩_∩)O~

幸福,不是长生不老,不是大鱼大肉,不是权倾朝野。幸福是每一个微小的生活愿望达成。当你想吃的时候有得吃,想被爱的时候有人来爱你。

幸福,或许很简单,而又或许会很难。
幸福需要双方共同的靠近,而非单方的守候。
或许,总会有守候最后永恒的例子,但这也是在建立在有一定基础上而言的,否则,即使迈出了99%的步伐,付出了每一刻的心血,终究不会获得什么.

当然学识的获取最会需要积累,这又是另一种。

生活中总有着两类事

  1. 心血与坚持,灵感与梦想总会催发出果实的花苞。
  2. 命运与运气,转瞬与刹那的永恒

无论怎样,未来还是前方,今日已在脚下,↖(^ω^)↗,加油,每一位奋斗的人,与我的朋友,当年的后桌,同桌们。

希望最会浇灌出未来的花朵。

未来需要自己的把握与追求

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值