#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
const int INF = 1e9+10 ;
const int MAXN = 210 ;
const int MAXM = 1e4 + 10 ;
using namespace std ;
struct Edge
{
int u , v , x , y ;
Edge(int u=0, int v=0, int x=0, int y=0) : u(u) , v(v) , x(x) , y(y) {}
} ;
int N , M , U , V , X , Y , A , B ;
int ans = INF , id_ans , id , ansx , ansy ;
vector< pair<int,int > > resp[MAXN] ;
vector<Edge> edge ;
int calc(int x , int y) { return x * A + y * B ; }
bool cmp1(Edge a , Edge b) { return a.x < b.x || (a.x == b.x && a.y < b.y) ; }
bool cmp2( Edge a , Edge b ) { return a.x > b.x || (a.x == b.x && a.y < b.y ) ; }
bool cmp3( Edge a , Edge b ) { return calc(a.x, a.y) < calc(b.x, b.y) ; }
// -------------------------------
//Kruskal's algorithm
int pai[MAXN] ;
int find(int x) { return ( pai[x] == x ) ? x : (pai[x] = find(pai[x]) ) ; }
bool join(int a, int b)
{
a = find(a) ;
b = find(b) ;
if( a == b ) return false ;
if( rand() % 2 == 1 ) pai[a] = b ;
else pai[b] = a ;
return true ;
}
pair<int,int> MST( vector<Edge> edg, int save = 0 )
{
iota(pai, pai+N , 0) ;
id ++ ;
X = 0 , Y = 0 ;
for(Edge e : edg )
if( join( e.u , e.v ) )
X += e.x , Y += e.y , resp[id].push_back( make_pair(e.u, e.v) ) ;
return make_pair( X , Y ) ;
}
inline void remake( pair<int,int> p1 )
{
if( ans <= p1.first * p1.second ) return ;
ans = p1.first * p1.second ;
ansx = p1.first ;
ansy = p1.second ;
id_ans = id ;
}
// -------------------------------
int main()
{
scanf("%d%d", &N , &M ) ;
for(int i = 1 ; i <= M ; i++ )
{
scanf("%d%d%d%d", &U, &V, &X, &Y ) ;
edge.push_back( Edge(U,V,X,Y) ) ;
}
sort( all(edge) , cmp1 ) ;
pair<int,int> p1 = MST( edge ) ;
remake(p1) ;
sort( all(edge) , cmp2 ) ;
pair<int,int> p2 = MST(edge) ;
remake(p2) ;
queue< pair< pair<int,int> ,pair<int,int> > > fila ;
fila.push( make_pair(p1,p2) ) ;
int cnt = 110 ;
while( !fila.empty() && cnt -- )
{
pair<int,int> l = fila.front().first ;
pair<int,int> r = fila.front().second ;
fila.pop() ;
//printf("Testing %d %d, %d %d\n", l.first, l.second, r.first, r.second ) ;
A = l.second - r.second ;
B = -l.first + r.first ;
sort(all(edge) , cmp3 ) ;
pair<int,int> res = MST(edge) ;
remake(res) ;
if( res == l || res == r )
continue ;
fila.push( make_pair(l,res) ) ;
fila.push( make_pair(res, r) ) ;
}
printf("%d %d\n" , ansx, ansy ) ;
for(auto i : resp[id_ans]) printf("%d %d\n" , i.first, i.second ) ;
}
Compilation message
timeismoney.cpp: In function 'int main()':
timeismoney.cpp:76:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &N , &M ) ;
~~~~~^~~~~~~~~~~~~~~~~~
timeismoney.cpp:79:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d%d", &U, &V, &X, &Y ) ;
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
376 KB |
Output is correct |
2 |
Correct |
5 ms |
256 KB |
Output is correct |
3 |
Correct |
5 ms |
256 KB |
Output is correct |
4 |
Correct |
6 ms |
376 KB |
Output is correct |
5 |
Correct |
7 ms |
376 KB |
Output is correct |
6 |
Correct |
7 ms |
504 KB |
Output is correct |
7 |
Incorrect |
17 ms |
632 KB |
Output isn't correct |
8 |
Incorrect |
58 ms |
852 KB |
Output isn't correct |
9 |
Correct |
5 ms |
256 KB |
Output is correct |
10 |
Correct |
5 ms |
376 KB |
Output is correct |
11 |
Correct |
5 ms |
376 KB |
Output is correct |
12 |
Correct |
5 ms |
376 KB |
Output is correct |
13 |
Correct |
5 ms |
376 KB |
Output is correct |
14 |
Incorrect |
9 ms |
380 KB |
Output isn't correct |
15 |
Correct |
9 ms |
632 KB |
Output is correct |
16 |
Incorrect |
26 ms |
632 KB |
Output isn't correct |
17 |
Correct |
26 ms |
636 KB |
Output is correct |
18 |
Correct |
26 ms |
632 KB |
Output is correct |
19 |
Incorrect |
119 ms |
852 KB |
Output isn't correct |
20 |
Incorrect |
120 ms |
852 KB |
Output isn't correct |