Prim算法
2019-04-14 21:13发布
生成海报
1003 电话连线
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。
输入描述 Input Description
输入文件的第一行是n的值(n<=100).
第二行至第n+1行是一个n*n的矩阵,第i行第j列的数如果为0表示城市i与城市j有电话线连接,否则为这两个城市之间的连接费用(范围不超过10000)。
输出描述 Output Description
输出文件的第一行为你连接的电话线总数m,第二行至第m+1行为你连接的每条电话线,格式为i j,(i
第m+2行是连接这些电话线的总费用。
样例输入 Sample Input
5
0 15 27 6 0
15 0 33 19 11
27 33 0 0 17
6 19 0 0 9
0 11 17 9 0
样例输出 Sample Output
2
1 4
2 5
17
数据范围及提示 Data Size & Hint
n<=100
分类标签 Tags 点此展开
#include
#include
#include
using namespace std;
int n,p[109][109];
int sum=0,temp=0;
struct N
{
int a,b;
} q[109];
void Prim()
{
int Lowcost[109],mst[109],d,vis[109];
memset(vis,0,sizeof(vis));
for (int i=2; i<=n; i++)
{
Lowcost[i]=p[1][i];
mst[i]=1;
}
Lowcost[1]=0;
vis[1]=1;
for (int i=0;i
{
int Min=99999999,c=0,d;
for (int i=1; i<=n; i++) //找到最小边
{
if (vis[i]==1)
{
c++;
continue;
}
if (Min>Lowcost[i])
{
Min=Lowcost[i];
d=i;
}
}
if (c==n) break;
sum+=Min;
vis[d]=1;
if (Min)
{
q[temp].a=min(d,mst[d]);
q[temp].b=max(d,mst[d]);
temp++;
}
for (int i=2; i<=n; i++)
{
if (!vis[i]&&Lowcost[i]>p[i][d])
{
Lowcost[i]=p[i][d];
mst[i]=d;
}
}
}
}
int main()
{
cin>>n;
//输入数据
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
cin>>p[i][j];
}
}
//Prim算法实现
Prim();
//sort(q,q+temp,So);
cout<
for (int i=0; i
{
cout<
}
cout<
return 0;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮