数据结构实验之图论六:村村通公路(并查集未解决,超时(已解决),WA;prim已解决)

数据结构实验之图论六:村村通公路

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

Problem Description

当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。

Input

连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。 

Output

输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。 

Sample Input

5 8
1 2 12
1 3 9
1 4 11
1 5 3
2 3 6
2 4 9
3 4 4
4 5 6

Sample Output

19

Hint

#include <stdio.h>
#include <stdlib.h>
int f[1115];
struct node
{
    int u, v;
    int cost;
} q[1005];
int cmp1(const void *a,const void *b)
{
    return (*(struct node *)a).cost - (*(struct node *)b).cost;
}
int getf(int u)
{
    if(f[u] == u)return u;
    f[u] = getf(f[u]);
    return f[u];
}
void  link(int u,int v)
{
    int t1 = getf(f[u]),t2 = getf(f[v]);
    if(t1 != t2)
    {
        f[t1] = t2;
    }
}
int main()
{
    int n,m,i,sum,j;
    while(~scanf("%d %d",&n,&m))
    {
        sum = 0;
        for(i = 1; i <=  n; i++)
        {
            f[i] = i;
        }

        for(i = 0; i < m; i++)
        {
            scanf("%d %d %d",&q[i].u,&q[i].v,&q[i].cost);
        }

        if(m<n-1)
        {
            printf("-1\n");
        }
        else
        {
            qsort(q,m+1,sizeof(q[0]),cmp1);
            for(i = 1,j = 0; i <= n-1;)
            {
                if(j > m)break;
                if(f[q[i].u] == f[q[i].v])
                {

                }
                else
                {
                    link(q[i].u,q[i].v);
                    sum += q[i].cost;
                    i++;
                }
                j++;
            }
            for(i = 1; i <= n; i++)
            {
                //printf("%d\n",getf(f[i]));
                if(getf(f[i]) != getf(f[i+1]))
                {
                    break;
                }
            }
            if(i != n)printf("-1\n");
            else printf("%d\n",sum);
        }
    }
    return 0;
}

Prim算法已AC

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 0x3f3f3f
int map[105][105];
int vis[105];
int dist[105];
void prim(int m)
{
    int i,j,k,min,ans = 0;
    for(i=1;i<= m;i++)
    {
        dist[i] = map[1][i];
    }
    vis[1] = 1;
    for(i = 2;i<=m;i++)
    {
        min = INF;
        for(j = 1;j <= m;j++)
        {
            if(min > dist[j] && !vis[j])
            {
                min = dist[j];
                k = j;
            }
        }
        if(min == INF)break;
        vis[k] = 1;
        ans = ans + min;
        for(j = 1;j <= m;j++)
        {
            if(!vis[j] && dist[j] > map[k][j])
            {
                dist[j] = map[k][j];
            }
        }
    }
    if(i == m + 1)printf("%d\n",ans);
    else
    printf("-1\n");
}
int main()
{
    int n,m,u,v,c,i;
    while(~scanf("%d %d",&n,&m))
    {
        memset(map,INF,sizeof(map));
        memset(vis,0,sizeof(vis));
        for(i = 1;i <= n;i++)
        {
            map[i][i] = 0;
        }
        while(m--)
        {
            scanf("%d %d %d",&u,&v,&c);
            if(map[u][v] > c)
            {
                map[u][v] = map[v][u] = c;
            }
        }
        prim(n);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40616644/article/details/81987272
今日推荐