首页 技术 正文
技术 2022年11月14日
0 收藏 430 点赞 3,517 浏览 1943 个字

BZOJ 1196: [HNOI2006]公路修建问题( MST )

水题…

容易发现花费最大最小即是求 MST

将每条边拆成一级 , 二级两条 , 然后跑 MST . 跑 MST 时 , 要先加 k 条一级road , 保证满足题意 , 然后再跑普通的 MST .

————————————————————————————

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i )#define clr( x , c ) memset( x , c , sizeof( x ) ) using namespace std; const int maxn = 10000 + 5; int n , k; inline int read() {char c = getchar();for( ; ! isdigit( c ) ; c = getchar() );int ans = 0;for( ; isdigit( c ) ; c = getchar() )    ans = ans * 10 + c – ‘0’;return ans;} struct edge {int u , v , w;bool t; // t == 0 -> secondedge() { }edge( int _u , int _v , int _w , int _t ) :u( _u ) , v( _v ) , w( _w ) , t( _t ) { }bool operator < ( const edge &e ) const {return w < e.w;}}; edge E[ maxn << 2 ];int cnt = 0;int p[ maxn ]; void init() {n = read();k = read();int m = read();while( –m ) {int u = read() – 1 , v = read() – 1 , c1 = read() , c2 = read();E[ cnt++ ] = edge( u , v , c1 , 1 );E[ cnt++ ] = edge( u , v , c2 , 0 );}rep( i , n ) p[ i ] = i;} int find( int x ) {return x == p[ x ] ? x : p[ x ] = find( p[ x ] );} void work() {int ans = 0;sort( E , E + cnt );rep( i , cnt ) if( E[ i ].t ) {edge* e = E + i;int a = find( e -> u ) , b = find( e -> v );if( a != b ) {p[ a ] = b;    ans = max( e -> w , ans );    if( ! –k ) break;}}rep( i , cnt ) {edge* e = E + i;int a = find( e -> u ) , b = find( e -> v );if( a != b )     p[ a ] = b ,    ans = max( ans , e -> w );}cout << ans << “\n”;} int main() {freopen( “test.in” , “r” , stdin );init();work();return 0;}

————————————————————————————

1196: [HNOI2006]公路修建问题

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1345  Solved: 750
[Submit][Status][Discuss]

Description

OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多。然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕。所以,OIER Association组织成立了,旨在建立OI island的交通系统。 OI island有n个旅游景点,不妨将它们从1到n标号。现在,OIER Association需要修公路将这些景点连接起来。一条公路连接两个景点。公路有,不妨称它们为一级公路和二级公路。一级公路上的车速快,但是修路的花费要大一些。 OIER Association打算修n-1条公路将这些景点连接起来(使得任意两个景点之间都会有一条路径)。为了保证公路系统的效率, OIER Association希望在这n-1条公路之中,至少有k条(0≤k≤n-1)一级公路。OIER Association也不希望为一条公路花费的钱。所以,他们希望在满足上述条件的情况下,花费最多的一条公路的花费尽可能的少。而你的任务就是,在给定一些可能修建的公路的情况下,选择n-1条公路,满足上面的条件。

Input

第一行有三个数n(1≤n≤10000),k(0≤k≤n-1),m(n-1≤m≤20000),这些数之间用空格分开。 N和k如前所述,m表示有m对景点之间可以修公路。以下的

HINT

Source

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,022
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,359
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,142
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,773
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,851