传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2395
其实还不太会写……
Code:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
struct edge{
int u,v,w,c,t;
bool operator<(const edge &E)const{
return w<E.w;
}
};
struct Point{
int x,y;
}ans=(Point){1e9,1e9};
Point minc,mint;
edge edges[10010];
int fa[201];
int find(int x){
return fa[x]!=x?fa[x]=find(fa[x]):x;
}
int n,m;
Point Mst(){
Point p=(Point){0,0};
sort(edges+1,edges+1+m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
int fx=find(edges[i].u),fy=find(edges[i].v);
if(fx!=fy){
fa[fx]=fy;
p.x+=edges[i].c;
p.y+=edges[i].t;
}
}
if((LL)ans.x*ans.y==(LL)p.x*p.y&&ans.x>p.x)ans=p;
if((LL)ans.x*ans.y>(LL)p.x*p.y)ans=p;
return p;
}
LL Cross(Point x,Point y,Point z)
{
return((LL)(x.x-z.x)*(y.y-z.y)-(LL)(x.y-z.y)*(y.x-z.x));
}
void solve(Point minc,Point mint)
{
LL c=mint.x-minc.x,t=minc.y-mint.y;
for (int i=1;i<=m;i++) edges[i].w=edges[i].c*t+edges[i].t*c;
Point p=Mst();
if (Cross(p,minc,mint)>=0) return;
solve(minc,p);
solve(p,mint);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d%d",&edges[i].u,&edges[i].v,&edges[i].c,&edges[i].t),
edges[i].u++,edges[i].v++;
for(int i=1;i<=m;i++)edges[i].w=edges[i].c;
minc=Mst();
for(int i=1;i<=m;i++)edges[i].w=edges[i].t;
mint=Mst();
solve(minc,mint);
printf("%d %d\n",ans.x,ans.y);
return 0;
}