HDU 1102 Constructing Roads (最小生成树)

Constructing Roads

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19673 Accepted Submission(s): 7510


Problem Description
There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected.

We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.


Input
The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.

Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.


Output
You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.


Sample Input
3
0 990 692
990 0 179
692 179 0
1
1 2


Sample Output

179


题解:建路使各个村庄都连通N个村庄,

0 990 692  ····························1—(0)—1,1——(990)——2,1——(692)——3
990 0 179 ························· 2——(990)——1,  2——(0)————2,2———(179)——3

692 179 0·································3——(692)——1,3——(179)——2,3———(0)———3


1            ·························已经建好的路数
1 2         ···························路(可以将建好的路之间的距离定为0)

采用prime 算法


代码:

///
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int n,ans;
int book[maxx];///记录
int e[maxx][maxx];
int dis[maxx];///存放最短距离
///prime算法核心
void prime ()
{ 
    for(int i=1; i<=n; i++)///看似1-其他点的距离
    {
        dis[i]=e[1][i];
        book[i]=0;
    }
    book[1]=1;
    dis[1]=0;
    int u;
    for(int i=1; i<=n; i++)
    {
        int minn=inf;
        for(int j=1; j<=n; j++)
            if(!book[j]&&dis[j]<minn)
            {
                minn=dis[j];
                u=j;
            }
        if(minn==inf)
            break;
        book[u]=1;
        ans+=dis[u];
        for(int v=1; v<=n; v++)
        {
            if(!book[v]&&dis[v]>e[u][v])
                dis[v]=e[u][v];
        }
    }

}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            scanf("%d",&e[i][j]);
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            e[a][b]=e[b][a]=0;///将已经建好的路之间的距离定为0
        }
        ans=0;
        prime();
        printf("%d\n",ans);

    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值