http://acm.hdu.edu.cn/showproblem.php?pid=1879
解题思路:这道题给出的数据里有一些路是已经建好的,所以这条路的成本就不计入总成本中,所以把它直接设置为0。这道题要注意的就是这个了,然后又是prim算法,我晕哦,畅通工程怎么都这个算法。
int Graph[MaxSize][MaxSize];
long sum;
bool visited[MaxSize];
int NumOfVillage;
void Prim()
{
int i,j;
sum = 0;
int dist[MaxSize];
int min,locate;
memset(visited,0,sizeof(visited));
for(i=1;i<=NumOfVillage;i++)
dist[i] = Graph[1][i];
visited[1] = true;
for (j=1;j<=NumOfVillage;j++)
{
min = INIT;
for (i=1;i<=NumOfVillage;i++)
{
if(!visited[i]&&dist[i]<min)
{
min = dist[i];
locate = i;
}
}
visited[locate] = true;
for (i=1;i<=NumOfVillage;i++)
{
if (!visited[i]&&dist[i]>Graph[locate][i])
{
dist[i] = Graph[locate][i];
}
}
}
for (i=1;i<=NumOfVillage;i++)
{
sum+=dist[i];
}
}
int main()
{
int i,j,N,status,weight;
while (scanf("%d",&NumOfVillage)!=EOF&&NumOfVillage)
{
N = (NumOfVillage*(NumOfVillage-1))/2;
for (i=1;i<=NumOfVillage;i++)
{
for (j=1;j<=NumOfVillage;j++)
{
if(i==j)
Graph[i][j] = 0;
else
Graph[i][j] = INIT;
}
}
while (N--)
{
scanf("%d%d%d%d",&i,&j,&weight,&status);
if(!status)
{
Graph[i][j] = weight;
Graph[j][i] = weight;
}
else
{
Graph[i][j] = 0;
Graph[j][i] = 0;
}
}
Prim();
printf("%ld/n",sum);
}
return 0;
}