简单的最小生成树,把已经建好的路的边权值设为0就OK了
Title
#include <iostream> using namespace std; #define inf 10000000 int sum; int arcs[110][110]; struct Edge { int point; int lowcost; }edge[110]; void prim(int n) { int i,j,k = 0; int min; j = 0; for (i = 0;i < n;i++) { if (i != j) { edge[i].point = i; edge[i].lowcost = arcs[j][i]; } } edge[j].lowcost = -1; for (i = 0;i < n;i++) { min = inf; for (j = 0;j < n;j++) { if (edge[j].lowcost != -1 && edge[j].lowcost < min) { k = j; min = edge[j].lowcost; } } sum += edge[k].lowcost; edge[k].lowcost = -1; for (j = 0;j < n;j++) { if (arcs[k][j] < edge[j].lowcost) { edge[j].point = k; edge[j].lowcost = arcs[k][j]; } } } } int main() { int n,t,a,b,x,s,i,j; while (scanf("%d",&n) == 1 && n != 0) { for (i = 0;i < 110;i++) for (j = 0;j < 110;j++) arcs[i][j] = inf; t = n * (n - 1) / 2; for (i = 0;i < t;i++) { scanf("%d %d %d %d",&a,&b,&x,&s); if (s == 1) arcs[a-1][b-1] = arcs[b-1][a-1] = 0; else if (s == 0) arcs[a-1][b-1] = arcs[b-1][a-1] = x; } sum = 0; prim(n); printf("%d\n",sum+1); } return 0; }