您的位置:首页 > 其它

poj2075 Tangled in Cables 最小生成树+map,kruskal

2014-07-11 23:59 357 查看
题目链接:http://poj.org/problem?id=2075

思路:最小生成树问题,只是点集是以字符串的形式给出的,使用一个map建立string到int的映射就好了。还是kruskal算法。kruskal算法用熟了不想试着写prim了。。。

///2014.7.11
///poj2075

//Accepted    780K    16MS    G++ 1546B   2014-07-11 23:39:33

/*
*最小生成树 + map
*/

#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;

int n,m;
double has,need;
struct Vdge
{
int x,y;
double l;
};
Vdge vdge[50000];
bool cmp(Vdge a,Vdge b){
return a.l<b.l;
}
int dSet[300];
int find(int x){
while( x != dSet[x] )
x = dSet[x];
return x;
}
bool judge(int x,int y){
int fx = find(x);
int fy = find(y);
if( fx==fy )
return false;
else{
dSet[fx] = fy;
return true;
}
}

void init(){
map<string,int> name;
cin>>has>>n;
string nname;
for(int i=0 ; i<n ; i++){
cin>>nname;
name[nname] = i;
}
cin>>m;
string name1,name2;
double temp;
for(int i=0 ; i<m ; i++){
cin>>name1>>name2>>temp;
vdge[i].x = name[name1];
vdge[i].y = name[name2];
vdge[i].l = temp;
}
for(int i=0 ; i<n ; i++)
dSet[i] = i;
sort(vdge,vdge+m,cmp);
need = 0;
}
void kruskal(){
int i=0,j=0;
while( i<n-1 ){
if( judge(vdge[j].x,vdge[j].y) ){
need += vdge[j].l;
i++;
}
j++;
}
}

int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);

init();
// out();
kruskal();
if( need <= has )
cout<<"Need "<<need<<" miles of cable"<<endl;
else
cout<<"Not enough cable"<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: