您的位置:首页 > 其它

UVA 11228 - Transportation system.

2013-03-30 09:54 302 查看
MST,一条边长度大于t那么就连着两个州,州的数量等于 长度大于t的边的数量+1

#include <iostream>
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <memory.h>
using namespace std;

struct edge
{
int u,v;
double w;
edge(int uu=0,int vv=0,double ww=0):u(uu),v(vv),w(ww){}
};
vector<edge> ev;
int id[1001];
int size[1001];
int n,scnt;
double tv;

bool cmp(const edge & ce1,const edge &ce2){
return ce1.w<ce2.w;
}
void init(){
ev.clear();
for (int i=0;i<n;++i)
{
id[i]=i;
size[i]=1;
}
}

int find(int p){
return p==id[p]?p:id[p]=find(id[p]);
}

bool uni(int p,int q){
int pp=find(p),pq=find(q);
if(pp==pq)return false;
if(size[pp]>size[pq]){
id[pq]=pp;
size[pp]+=size[pq];
}else{
id[pp]=pq;
size[pq]+=size[pp];
}
return true;
}

pair<int,int> kruskcal(){
sort(ev.begin(),ev.end(),cmp);
int i=0,j=0;
double rSum=0,raSum=0;
for (;i<ev.size()&&j<n-1;++i)
{
if(uni(ev[i].u,ev[i].v)){
if(ev[i].w>tv){
raSum+=ev[i].w;//只要一条边的长度大于t那么这个条边连着2个州
scnt++;
}else{
rSum+=ev[i].w;
}
++j;
}
}
scnt++;//最后把州的个数+1,因为州的数量等于边长度大于t的数量加1
rSum=(int)(rSum+0.5);
raSum=(int)(raSum+0.5);
return pair<int,int>(rSum,raSum);
}
int main(){
int t,i,cas=1;
cin>>t;
while (t--)
{
cin>>n>>tv;
init();
vector<pair<int,int> >pv;
for (i=0;i<n;++i)
{
int x,y;
scanf("%d %d",&x,&y);
pv.push_back(pair<int,int>(x,y));
}

scnt=0;
for (i=0;i<pv.size();++i)
{
for (int j=i+1;j<pv.size();++j)
{
ev.push_back(edge(i,j,sqrt((pv[j].first-pv[i].first)*(pv[j].first-pv[i].first)+(pv[j].second-pv[i].second)*(pv[j].second-pv[i].second))));
}
}
pair<int,int> r=kruskcal();
cout<<"Case #"<<cas++<<": "<<scnt<<' '<<r.first<<' '<<r.second<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: