#include
<
iostream
>
#include < cstdio >
#include < map >
#include < algorithm >
#include < string >
using namespace std;
int par[ 5000 ],n,m;
struct In
{
int from,to,len;
}s[ 100000 ];
bool cmp(In a,In b)
{
return a.len < b.len;
}
void init()
{
int i;
for (i = 1 ;i <= n;i ++ )par[i] = i;
}
int getr( int x)
{
if (par[x] == x) return x;
return par[x] = getr(par[x]);
}
bool u( int x, int y)
{
int p,q;
p = getr(x);
q = getr(y);
if (q == p) return false ;
par[p] = q;
return true ;
}
map < string , int > M;
int main()
{
int i,j,k,t,x,y,p;
int ans = 0 ;
string str1,str2;
scanf( " %d " , & t);
while (t -- )
{
scanf( " %d%d " , & n, & m);
M.clear();
init();
p = 1 ;
for (i = 0 ;i < m;i ++ )
{
cin >> str1 >> str2 >> s[i].len;
x = M[str1];
y = M[str2];
if (x == 0 )
{
M[str1] = p;
x = p ++ ;
}
if (y == 0 )
{
M[str2] = p;
y = p ++ ;
}
s[i].from = x;
s[i].to = y;
}
sort(s,s + m,cmp);
n -- ;
ans = 0 ;
for (i = 0 ;i < m && n;i ++ )
{
if (u(s[i].from,s[i].to))
{
n -- ;
ans += s[i].len;
}
}
cout << ans << endl;
if (t != 0 )cout << endl;
}
return 0 ;
}
#include < cstdio >
#include < map >
#include < algorithm >
#include < string >
using namespace std;
int par[ 5000 ],n,m;
struct In
{
int from,to,len;
}s[ 100000 ];
bool cmp(In a,In b)
{
return a.len < b.len;
}
void init()
{
int i;
for (i = 1 ;i <= n;i ++ )par[i] = i;
}
int getr( int x)
{
if (par[x] == x) return x;
return par[x] = getr(par[x]);
}
bool u( int x, int y)
{
int p,q;
p = getr(x);
q = getr(y);
if (q == p) return false ;
par[p] = q;
return true ;
}
map < string , int > M;
int main()
{
int i,j,k,t,x,y,p;
int ans = 0 ;
string str1,str2;
scanf( " %d " , & t);
while (t -- )
{
scanf( " %d%d " , & n, & m);
M.clear();
init();
p = 1 ;
for (i = 0 ;i < m;i ++ )
{
cin >> str1 >> str2 >> s[i].len;
x = M[str1];
y = M[str2];
if (x == 0 )
{
M[str1] = p;
x = p ++ ;
}
if (y == 0 )
{
M[str2] = p;
y = p ++ ;
}
s[i].from = x;
s[i].to = y;
}
sort(s,s + m,cmp);
n -- ;
ans = 0 ;
for (i = 0 ;i < m && n;i ++ )
{
if (u(s[i].from,s[i].to))
{
n -- ;
ans += s[i].len;
}
}
cout << ans << endl;
if (t != 0 )cout << endl;
}
return 0 ;
}
#include
<
stdio.h
>
#include < iostream >
#include < string .h >
#include < string >
#include < algorithm >
#include < map >
using namespace std;
map < string , int > mp;
string ss;
char s[ 100 ];
struct ppp
{
int u,v,len;
} e[ 60000 ];
bool cmp( const ppp & u, const ppp & v)
{
return u.len < v.len;
}
int fa[ 10000 ];
int finds( int x)
{
if (fa[x] != x) fa[x] = finds(fa[x]);
return fa[x];
}
int main()
{
int cas,n,m,u,v,len;
scanf( " %d " , & cas);
for ( int ll = 1 ;ll <= cas;ll ++ )
{
if (ll != 1 ) puts( "" );
scanf( " %d%d " , & n, & m);
mp.clear();
int num = 0 ;
for ( int i = 0 ;i < m;i ++ )
{
scanf( " %s " ,s);
ss = s;
if (mp[ss] == 0 ) mp[ss] =++ num;
u = mp[ss];
scanf( " %s " ,s);
ss = s;
if (mp[ss] == 0 ) mp[ss] =++ num;
v = mp[ss];
scanf( " %d " , & len);
e[i].u = u;e[i].v = v;e[i].len = len;
}
sort(e,e + m,cmp);
for ( int i = 1 ;i <= n;i ++ ) fa[i] = i;
int ans = 0 ;
for ( int i = 0 ;i < m;i ++ )
{
int t1 = finds(e[i].u);
int t2 = finds(e[i].v);
if (t1 != t2)
{
fa[t1] = t2;
ans += e[i].len;
}
}
printf( " %d\n " ,ans);
}
return 0 ;
}
#include < iostream >
#include < string .h >
#include < string >
#include < algorithm >
#include < map >
using namespace std;
map < string , int > mp;
string ss;
char s[ 100 ];
struct ppp
{
int u,v,len;
} e[ 60000 ];
bool cmp( const ppp & u, const ppp & v)
{
return u.len < v.len;
}
int fa[ 10000 ];
int finds( int x)
{
if (fa[x] != x) fa[x] = finds(fa[x]);
return fa[x];
}
int main()
{
int cas,n,m,u,v,len;
scanf( " %d " , & cas);
for ( int ll = 1 ;ll <= cas;ll ++ )
{
if (ll != 1 ) puts( "" );
scanf( " %d%d " , & n, & m);
mp.clear();
int num = 0 ;
for ( int i = 0 ;i < m;i ++ )
{
scanf( " %s " ,s);
ss = s;
if (mp[ss] == 0 ) mp[ss] =++ num;
u = mp[ss];
scanf( " %s " ,s);
ss = s;
if (mp[ss] == 0 ) mp[ss] =++ num;
v = mp[ss];
scanf( " %d " , & len);
e[i].u = u;e[i].v = v;e[i].len = len;
}
sort(e,e + m,cmp);
for ( int i = 1 ;i <= n;i ++ ) fa[i] = i;
int ans = 0 ;
for ( int i = 0 ;i < m;i ++ )
{
int t1 = finds(e[i].u);
int t2 = finds(e[i].v);
if (t1 != t2)
{
fa[t1] = t2;
ans += e[i].len;
}
}
printf( " %d\n " ,ans);
}
return 0 ;
}
#include
<
iostream
>
#include < memory.h >
#include < string >
#include < cstdio >
#include < algorithm >
#include < math.h >
#include < stack >
#include < queue >
#include < map >
using namespace std;
const int inf = 1 << 30 ;
const int MAX = 2005 ;
int g[MAX][MAX],dis[MAX];
map < string , int > mp;
void prim( int n)
{
int i,j,k,ans = 0 ,min_node,maxx;
for (i = 1 ;i <= n;i ++ )
dis[i] = inf;
dis[ 1 ] = 0 ;
for (i = 1 ;i <= n;i ++ )
{
maxx = inf;
for (j = 1 ;j <= n;j ++ )
{
if (dis[j] !=- 1 && dis[j] < maxx)
{
maxx = dis[j];
min_node = j;
}
}
ans += maxx;
dis[min_node] =- 1 ;
for (j = 1 ;j <= n;j ++ )
{
if (g[min_node][j] != 0 && dis[j] > g[min_node][j])
dis[j] = g[min_node][j];
}
}
cout << ans << endl;
}
int main()
{
int i,j,k,T,n,m,w,flag = 1 ;
char s1[ 10 ],s2[ 10 ];
scanf( " %d " , & T);
while (T -- )
{
if ( ! flag)
cout << endl;
flag = 0 ;
memset(g, 0 , sizeof (g));
mp.clear();
scanf( " %d%d " , & n, & m);
k = 0 ;
while (m -- )
{
scanf( " %s%s%d " ,s1,s2, & w);
i = mp[s1];
if (i == 0 )
{
mp[s1] =++ k;
i = k;
}
j = mp[s2];
if (j == 0 )
{
mp[s2] =++ k;
j = k;
}
if (g[i][j] == 0 )
{
g[i][j] = g[j][i] = w;
}
else
{
g[i][j] = min(g[i][j],w);
g[j][i] = g[i][j];
}
}
/* for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<g[i][j]<<" ";
}
cout<<endl;
} */
prim(n);
}
return 0 ;
}
#include < memory.h >
#include < string >
#include < cstdio >
#include < algorithm >
#include < math.h >
#include < stack >
#include < queue >
#include < map >
using namespace std;
const int inf = 1 << 30 ;
const int MAX = 2005 ;
int g[MAX][MAX],dis[MAX];
map < string , int > mp;
void prim( int n)
{
int i,j,k,ans = 0 ,min_node,maxx;
for (i = 1 ;i <= n;i ++ )
dis[i] = inf;
dis[ 1 ] = 0 ;
for (i = 1 ;i <= n;i ++ )
{
maxx = inf;
for (j = 1 ;j <= n;j ++ )
{
if (dis[j] !=- 1 && dis[j] < maxx)
{
maxx = dis[j];
min_node = j;
}
}
ans += maxx;
dis[min_node] =- 1 ;
for (j = 1 ;j <= n;j ++ )
{
if (g[min_node][j] != 0 && dis[j] > g[min_node][j])
dis[j] = g[min_node][j];
}
}
cout << ans << endl;
}
int main()
{
int i,j,k,T,n,m,w,flag = 1 ;
char s1[ 10 ],s2[ 10 ];
scanf( " %d " , & T);
while (T -- )
{
if ( ! flag)
cout << endl;
flag = 0 ;
memset(g, 0 , sizeof (g));
mp.clear();
scanf( " %d%d " , & n, & m);
k = 0 ;
while (m -- )
{
scanf( " %s%s%d " ,s1,s2, & w);
i = mp[s1];
if (i == 0 )
{
mp[s1] =++ k;
i = k;
}
j = mp[s2];
if (j == 0 )
{
mp[s2] =++ k;
j = k;
}
if (g[i][j] == 0 )
{
g[i][j] = g[j][i] = w;
}
else
{
g[i][j] = min(g[i][j],w);
g[j][i] = g[i][j];
}
}
/* for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<g[i][j]<<" ";
}
cout<<endl;
} */
prim(n);
}
return 0 ;
}