/*
zoj_2326 最小生成树
依旧kruskal过的。。木有想到这样都上榜了。。。难道大家都不用map?
这题稍微注意的是输入格式。
收获:巩固了char* 转 string,注意append前先将字符串置为空
map 好像不支持 map< char*,int >,具体待查
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <string>
#include <string.h>
#include <map>
using namespace std;
map <string,int>mp;
struct node
{
int from,to;
double len;
};
priority_queue <node>pq;
int father[510];
double sum;
int count;
bool operator<( const node&a,const node&b )
{
return a.len>b.len;
}
int find_set( int a )
{
if( a!=father[a] )
{
father[a]=find_set( father[a] );
}
return father[a];
}
void union_set( int a,int b,double value )
{
int aa,bb;
aa=find_set(a);
bb=find_set(b);
if( aa==bb ) return;
father[bb]=aa;
sum+=value;
}
int main()
{
int n,m,i;
double all,t;
node temp;
char b[50],c[50];
string sb,sc;
while( scanf( "%lf",&all )!=EOF )
{
scanf( "%d",&n );
for( i=0;i<n;i++ )
{
scanf( "%s",c );
sc="";
sc.append(c);
mp[sc]=i;
father[i]=i;
}
scanf( "%d",&m );
for( i=0;i<m;i++ )
{
scanf( "%s %s %lf",b,c,&t );
sb="", sc="" ;
sb.append(b) , sc.append(c);
temp.from=mp[sb];
temp.to=mp[sc];
temp.len=t;
pq.push( temp );
}
sum=0.0; count=0;
while( !pq.empty() )
{
temp=pq.top(); pq.pop();
union_set( temp.from,temp.to,temp.len );
}
if( sum>all ) printf( "Not enough cable\n" );
else printf( "Need %.1lf miles of cable\n",sum );
}
return 0;
}
zoj 2326
最新推荐文章于 2017-06-06 18:51:00 发布