题意:在各个村之间建公路,求连通所有村的费用总和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879
最小生成树,直接套模板,不过用了cin没关同步,TLE了一发。
//prim算法
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;
/*
int adj[105][105];
int prim ( int num )
{
int dis[105] = { 0 };
int vis[105] = { 0 };
int min;
int sum = 0;
vis[1] = 1;
for ( int i = 1; i < num; i ++ )
{
dis[i] = adj[1][i];
}
for ( int i = 2; i < num; i ++ )
{
min = 10000000;
int n = 1;
for ( int k = 1; k < num; k ++ )
{
if ( ! vis[k] && min > dis[k] )
{
min = dis[k];
n = k;
}
}
vis[n] = 1;
sum += dis[n];
for ( int k = 1; k < num; k ++ )
{
if ( ! vis[k] && adj[n][k] < dis[k] )
{
dis[k] = adj[n][k];
}
}
}
return sum;
}
int main ()
{
//freopen ( "test.txt", "r", stdin );
ios::sync_with_stdio( false );
int n;
int a, b, c, d;
while ( cin >> n && n )
{
int k = n;
memset ( adj, 0, sizeof ( adj ) );
n = n * ( n - 1 ) / 2;
for ( int i = 0; i < n; i ++ )
{
cin >> a >> b >> c >> d;
if ( ! d )
{
adj[a][b] = adj[b][a] = c;
}
}
cout << prim ( k + 1 ) << endl;
}
return 0;
}
//Kruskal算法
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;
struct node{
int be;
int en;
int len;
int station;
};
struct node road[10005];
int set[10005];
bool cmp ( const node &a, const node & b )
{
return a.len < b.len ? 1 : 0;
}
void init()
{
memset ( road, 0, sizeof ( road ) );
for ( int i = 0; i < 10005; i ++ )
{
set[i] = i;
}
return;
}
int find ( int i )
{
if ( i == set[i] )
{
return i;
}
else
{
set[i] = find ( set[i] );
}
return set[i];
}
void print ( const int & k )
{
for ( int i = 0; i < k; i ++ )
{
cout << set[i] << ' ';
}
cout << endl;
}
int kruskal( const int &n )
{
int sum = 0;
for ( int i = 0; i < n; i ++ )
{
if ( road[i].station == 0 )
{
int m = find ( road[i].be );
int n = find ( road[i].en );
if ( m != n )
{
set[m] = set[n];
sum += road[i].len;
// cout << road[i].be << ' ' << road[i].en << ' ' << road[i].len << ' ' << road[i].station << endl;
}
}
//print( n );
}
return sum;
}
int main()
{
//freopen ( "test.txt", "r", stdin );
ios::sync_with_stdio( false );
int n;
while ( cin >> n && n )
{
init();
n = n * ( n - 1 ) / 2;
for ( int i = 0; i < n; i ++ )
{
cin >> road[i].be >> road[i].en >> road[i].len >> road[i].station;
if ( road[i].station )
{
int m = find ( road[i].en );
int n = find ( road[i].be );
if ( m != n )
{
set[m] = set[n];
}
}
}
sort ( road, road + n, cmp );
cout << kruskal( n ) << endl;
}
return 0;
}