某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。
输入格式:
输入的第一行给出村庄数目N (1);随后的(行对应村庄间道路的成本及修建状态:每行给出4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态 — 1表示已建,0表示未建。
输出格式:
输出全省畅通需要的最低成本。
输入样例:
4
1 2 1 1
1 3 4 0
1 4 1 1
2 3 3 0
2 4 2 1
3 4 5 0
输出样例:
3
我的代码:
(普里姆算法求最小生成树)
#include<stdio.h>
int n,m,i,j,x,y,dis,z,dist[101],cost[101][101],vis[101],sum=0;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) cost[i][j]=cost[j][i]=999999;
}
m=n*(n-1)/2;
while(m--)
{
scanf("%d%d%d%d",&x,&y,&dis,&z);
if(z==0) cost[x][y]=cost[y][x]=dis;
else cost[x][y]=cost[y][x]=0;
}
for(i=1;i<=n;i++) dist[i]=cost[1][i];
vis[1]=1,dist[1]=0;
for(i=1;i<n;i++)
{
int min=999999,k=-1;
for(j=1;j<=n;j++)
{
if(vis[j]==0 && dist[j]<min)
{
min=dist[j];
k=j;
}
}
vis[k]=1;
if(k!=-1)
{
sum=sum+dist[k];
for(j=1;j<=n;j++)
{
if(vis[j]==0 && dist[j]>cost[k][j])
dist[j]=cost[k][j];
}
}
}
printf("%d\n",sum);
return 0;
}提交结果:
本文介绍了一个使用普里姆算法解决最小生成树问题的具体实例,旨在寻找连接所有城镇的最低成本快速道路网络。

被折叠的 条评论
为什么被折叠?



