【最小生成树入门专题1】A

来源:互联网 发布:windows longhorn壁纸 编辑:程序博客网 时间:2024/06/05 05:31

描述

最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了!

但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A、B、C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过这两条道路连通的)。

提示:不知道为什么Prim算法和Dijstra算法很像呢Σ(っ °Д °;)っ 。

输入

每个测试点(输入文件)有且仅有一组测试数据。

在一组测试数据中:

第1行为1个整数N,表示小Hi拥有的城市数量。

接下来的N行,为一个N*N的矩阵A,描述任意两座城市之间建造道路所需要的费用,其中第i行第j个数为Aij,表示第i座城市和第j座城市之间建造道路所需要的费用。

对于100%的数据,满足N<=10^3,对于任意i,满足Aii=0,对于任意i, j满足Aij=Aji, 0&ltAij&lt10^4.

输出

对于每组测试数据,输出1个整数Ans,表示为了使任意两座城市都可以通过所建造的道路互相到达至少需要的建造费用。

Sample Input
50 1005 6963 392 1182 1005 0 1599 4213 1451 6963 1599 0 9780 2789 392 4213 9780 0 5236 1182 1451 2789 5236 0 
Sample Output
4178

虽然是个模板题 但是好歹是自己第一次用prime算法A的题    再水也留个纪念吧,今天已经被堆排序给废了,明天起来待我把优化的prime算法给学会


#include<stdio.h>#define N 1100#define inf 99999999int book[N],dis[N],e[N][N];int main(){int n;int i,j,sum,count,u,min;while(scanf("%d",&n)!=EOF){sum =0 ;count = 0;for(i = 1; i <= n; i ++)for(j = 1; j <= n; j ++)if(i == j)e[i][j] = 1;else e[i][j] = inf;for(i = 1; i <= n; i ++)book[i] = 0;for(i = 1; i <= n; i ++){for(j = 1; j <= n; j ++){scanf("%d",&u);e[i][j] = u;e[j][i] = u;}}for(i = 1; i <= n; i ++)dis[i] = e[1][i];book[1] = 1;count ++;while(count < n){min = inf;for(i = 1; i <= n; i ++){if(!book[i]&&dis[i] < min){u = i;min = dis[i];}}book[u] = 1;sum = sum + dis[u];count ++;for(i = 1; i <= n; i ++){if(!book[i]&&dis[i]>e[u][i])dis[i] = e[u][i];}}printf("%d\n",sum);}return 0;}





原创粉丝点击