某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。
输入格式:
输入的第一行给出村庄数目N (1≤N≤100);随后的N(N−1)/2行对应村庄间道路的成本及修建状态:每行给出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 <bits/stdc++.h>
using namespace std;
#define MAXLEN 10000
int Graph[110][110];
int pointnum, edgenum, closedge[110];
int minlength()
{
int pos = -1, minedge = MAXLEN;
for(int i = 1; i <= pointnum; ++i)
if(closedge[i] < minedge && closedge[i] != -1)
{
pos = i;
minedge = closedge[i];
}
return pos;
}
int prim()
{
int nextpt, minedge = MAXLEN;
int minprice = 0;
for(int i = 1; i <= pointnum; ++i)
closedge[i] = MAXLEN;
closedge[1] = -1;
for(int i = 2; i <= pointnum; ++i)
closedge[i] = Graph[1][i];
for(int i = 1; i < pointnum; ++i)
{
nextpt = minlength();
if(nextpt != -1)
{
minprice += closedge[nextpt];
closedge[nextpt] = -1;
for(int j = 1; j <= pointnum; ++j)
{
if(Graph[nextpt][j] < closedge[j])
closedge[j] = Graph[nextpt][j];
}
}
}
return minprice;
}
int main()
{
int minprice;
scanf("%d", &pointnum);
edgenum = pointnum * (pointnum - 1) / 2;
for(int i = 1; i <= pointnum; ++i)
for(int j = 1; j <= pointnum; ++j)
Graph[i][j] = MAXLEN;
for(int i = 1; i <= edgenum; ++i)
{
int pos1, pos2, weight, flag;
scanf("%d %d %d %d", &pos1, &pos2, &weight, &flag);
if(flag == 1)
{
Graph[pos1][pos2] = 0;
Graph[pos2][pos1] = 0;
}
else
{
Graph[pos1][pos2] = weight;
Graph[pos2][pos1] = weight;
}
}
minprice = prim();
printf("%d", minprice);
}