HDOJ 1879 继续畅通工程

来源:互联网 发布:win10获取权限软件 编辑:程序博客网 时间:2024/05/23 15:47

题意:在各个村之间建公路,求连通所有村的费用总和

链接: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;}



0 0