九度OJ:题目 1028 继续畅通工程

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

    当N为0时输入结束。
输出:
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
样例输入:
3
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
样例输出:
3
1

0

[解题思路]

1.Prim最小生成树问题

2.如果已经修路则权重(花费)为0,代码如下:

        for(i=1;i<=M;i++){
            int s,e,w,t;
            scanf("%d %d %d %d",&s,&e,&w,&t);
			if(t) w=0;
            if(map[s][e]>w){
                map[s][e]=map[e][s]=w;
            }
        }

[题目AC代码]

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX 99999
#define R 101
#define C 101
 
int N,M;
bool visited[R];
int dist[R];
int map[R][C];
int sum;
 
void Prim(){
    int s=1,e;
    int i,j,k;
    int min=MAX;
    sum=0;
    memset(visited,false,sizeof(visited));
 
    for(i=1;i<=N;i++){
        if(map[s][i]!=MAX){
            dist[i]=map[s][i];
        }
    }
    visited[s]=true;
    dist[s]=0;
    for(k=1;k<N;k++){
        min=MAX;
        for(i=1;i<=N;i++){
            if(visited[i]==false&&dist[i]<min){
                min=dist[i];
                e=i;
            }
        }
        sum+=min;
        visited[e]=true;
        for(i=1;i<=N;i++){
            if(dist[i]>map[i][e]){
                dist[i]=map[i][e];
            }
        }
    }
}
int main(){
    while(scanf("%d",&N)==1&&N){
        M=(N*(N-1))/2;
        int i,j;
        for(i=1;i<=N;i++){
            for(j=1;j<=N;j++){
                map[i][j]=MAX;
            }
            dist[i]=MAX;
        }
        for(i=1;i<=M;i++){
            int s,e,w,t;
            scanf("%d %d %d %d",&s,&e,&w,&t);
			if(t) w=0;
            if(map[s][e]>w){
                map[s][e]=map[e][s]=w;
            }
        }
        Prim();
        printf("%d\n",sum);
    }
    return 0;
}

[题目网址]

http://ac.jobdu.com/problem.php?pid=1028

你可能感兴趣的:(数据结构,最小生成树,九度OJ)