hdu1102——Constructing Roads

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

居然是多组测试样例….

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=105;
const int INF=0x3f3f3f3f;
int g[N][N];
bool vis[N];
int low[N];
int n,q,a,b;
int prim(){
    int ans=0;
    int Min=INF;
    int pos=1;
    vis[pos]=true;
    for(int i=1;i<=n;i++){
        if(i!=pos){
            low[i]=g[pos][i];
        }
    }
    for(int i=1;i<n;i++){
        Min=INF;
        for(int j=1;j<=n;j++){
            if(!vis[j] && low[j]<Min){
                Min=low[j];
                pos=j;
            }
        }
        if(Min==INF){
            break;
        }
        vis[pos]=true;
        ans+=Min;
        for(int j=1;j<=n;j++){
            if(!vis[j] && low[j]>g[pos][j]){
                low[j]=g[pos][j];
            }
        }
    }
    return ans;
}
int main(void){
    while(~scanf("%d",&n)){
        memset(g,INF,sizeof(g));
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%d",&g[i][j]);
            }
        }
        scanf("%d",&q);
        while(q--){
            scanf("%d%d",&a,&b);
            g[a][b]=g[b][a]=0;
        }
        int ans=prim();
        printf("%d\n",ans);
    }
    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4363次浏览 47人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16917次浏览 137人参与
# 米连集团26产品管培生项目 #
7375次浏览 226人参与
# 沪漂/北漂你觉得哪个更苦? #
1616次浏览 41人参与
# 你的实习产出是真实的还是包装的? #
3196次浏览 53人参与
# 春招至今,你的战绩如何? #
16021次浏览 146人参与
# MiniMax求职进展汇总 #
25251次浏览 322人参与
# HR最不可信的一句话是__ #
1107次浏览 32人参与
# AI面会问哪些问题? #
971次浏览 24人参与
# 你做过最难的笔试是哪家公司 #
1306次浏览 23人参与
# AI时代,哪个岗位还有“活路” #
2930次浏览 53人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152945次浏览 889人参与
# 简历第一个项目做什么 #
32180次浏览 363人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8029次浏览 43人参与
# XX请雇我工作 #
51164次浏览 171人参与
# 简历中的项目经历要怎么写? #
311119次浏览 4271人参与
# 投格力的你,拿到offer了吗? #
178382次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
77008次浏览 375人参与
# AI时代,哪些岗位最容易被淘汰 #
64819次浏览 891人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187635次浏览 1123人参与
# 你怎么看待AI面试 #
180882次浏览 1318人参与
# 正在春招的你,也参与了去年秋招吗? #
364407次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务