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

来源:互联网 发布:淘宝刷销量处罚 编辑:程序博客网 时间:2024/04/27 19:47

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

Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

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

输出

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

示例输入

5 81 2 121 3 91 4 111 5 32 3 62 4 93 4 44 5 6

示例输出

19

提示

 

来源

xam 

示例程序

 解法一:(Prime算法)
#include<stdio.h>#include<string.h>#define INF 2147483647int vis[10000],dis[101][101];int lowc[10000];int prime(int cost[][101],int n){    int i,j,p;    int minc,res=0;    memset(vis,0,sizeof(vis));    vis[1]=1;    for(i=1;i<=n;i++)    {        lowc[i]=cost[1][i];    }    for(i=1;i<n;i++)    {        minc=INF;        p=-1;        for(j=1;j<=n;j++)        {            if(0==vis[j]&&minc>lowc[j])            {                minc=lowc[j];                p=j;            }        }        if(INF==minc)            return -1;        res+=minc;        vis[p]=1;        for(j=1;j<=n;j++)        {            if(vis[j]==0&&lowc[j]>cost[p][j])            {                lowc[j]=cost[p][j];            }        }    }    return res;}int main(){    int m,n,i,j,x,y,w;    while(scanf("%d %d",&n,&m)!=EOF)    {        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                if(j==i)                {                    dis[i][j]=0;            }            else            {                dis[i][j]=INF;            }            }        }        for(i=0;i<m;i++)        {            scanf("%d %d %d",&x,&y,&w);            if(dis[x][y]>w)            {                dis[x][y]=w;                dis[y][x]=w;            }        }        printf("%d\n",prime(dis,n));    }}


解法二:(Kruscal算法)

#include<stdio.h>#include<string.h>#include<stdlib.h>int m,n,t;int vset[1010];struct node{    int a,b,c;}s[3010];int find(int x){    while(x!=vset[x])        x=vset[x];    return x;}void Kruscal(){    int i,fx,fy;    for(i=0;i<m;i++)    {        fx=find(s[i].a);        fy=find(s[i].b);        if(fx!=fy)            {                t+=s[i].c;        vset[fx]=fy;            }    }}int cmp(const void *a,const void *b){    return (*(struct node *)a).c>(*(struct node *)b).c?1:-1;}int main(){    int i,j,k,l;    while(scanf("%d %d",&n,&m)!=EOF)    {        for(i=1;i<=n;i++)            vset[i]=i;        t=0;        for(i=0;i<m;i++)        {            scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].c);        }        qsort(s,m,sizeof(s[0]),cmp);        Kruscal();        l=0;        for(i=1;i<=n;i++)            if(find(i)==i)                l++;            if(l!=1)                printf("-1\n");            else        printf("%d\n",t);    }}


1 0
原创粉丝点击