您的位置:首页 > 其它

1005

2016-06-29 08:04 190 查看
题目编号:1005

题目大意:  省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。

解题思路:典型的并查集算法,根据并查集的模版就能算出来,不是很难的题。

做题感想:坚持就是胜利!

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int adj[100];
int vis[100];
int nearest[100];
int map[100][100];
int n,m;
int YJY()
{
int i,j,min;
int ans=0;
vis[1]=1;
for(i=2;i<=n;i++)
{
nearest[i]=map[1][i];
adj[i]=1;
}
int cnt=n-1;
while(cnt--)
{
min=inf;
j=1;
for(i=1;i<=n;i++)
{
if(!vis[i]&&nearest[i]<min)
{
min=nearest[i];
j=i;
}
}
ans+=map[j][adj[j]];
vis[j]=1;
for(i=1;i<=n;i++)
{
if(!vis[i]&&map[i][j]<nearest[i])
{
nearest[i]=map[i][j];
adj[i]=j;
}
}
}
return ans;
}
int main()
{
int i;
while(cin>>n&&n)
{
int b,c,d,sta;
memset(vis,0,sizeof(vis));
memset(map,inf,sizeof(map));
m=n*(n-1)/2;
for(i=0;i<m;i++)
{
cin>>b>>c>>d>>sta;
if(sta==0)
map[b][c]=map[c][b]=d;
else
map[b][c]=map[c][b]=0;
}
int sum=YJY();
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: