| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 38918 | Accepted: 15751 |
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
简单的最小生成树问题。。题意要你求得最短的距离。。1A水过
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int INF = 0x3f3f3f3f;
int map[105][105];//地图
int lowlen[105];//最短距离
int vist[105];//prim中用于看节点是否进树
int ans;
int n;
void init()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", &map[i][j]);
memset(vist, 0, sizeof(vist));
memset(lowlen, 0, sizeof(lowlen));
}
void prim()//prim算法
{
int temp;
ans = 0;
for(int i=1; i<=n; i++)
lowlen[i] = map[1][i];
vist[1] = -1;
for(int i=2; i<=n; i++)
{
temp = INF;
int k =0;
for(int j=1; j<=n; j++)
{
if( vist[j]!=-1 && temp>lowlen[j] )
{
temp = lowlen[j];
k = j;
}
}
vist[k] = -1;
ans += temp;
for(int j=1; j<=n; j++)
{
if(vist[j]!=-1 && lowlen[j]>map[k][j])
{
lowlen[j] = map[k][j];
}
}
}
printf("%d\n", ans);
}
int main()
{
while(scanf("%d", &n)==1)
{
init();
prim();
}
return 0;
}
POJ 1258:Agri-Net(最小生成树&&prim)
原文地址:http://blog.csdn.net/u013487051/article/details/38064357