水题…
容易发现花费最大最小即是求 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对景点之间可以修公路。以下的