Problem Description
当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。
Input
连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。
Output
输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。
Example Input
5 8 1 2 12 1 3 9 1 4 11 1 5 3 2 3 6 2 4 9 3 4 4 4 5 6
Example Output
19 方法一:#include<stdio.h> #include<string.h> #define maxn 1005 #define max 0x3f3f3f3f typedef struct node { int begin; int end; int weight; }edge; int map[maxn][maxn]; edge line[maxn]; void getmap(int m) { int i; int u,v,w; for(i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); map[u][v]=map[v][u]=w; } } int prim(int n) { int i,j,k,u; int min; int v; int num; int sum=0; edge temp; for(i=1;i<=n-1;i++) { line[i].begin=1; line[i].end=i+1; line[i].weight=map[1][i+1]; } for(j=1;j<=n-1;j++) { min=max; for(k=j;k<=n-1;k++) { if(line[k].weight<min) { min=line[k].weight; u=k; } } sum+=min; v=line[u].end; temp=line[u]; line[u]=line[j]; line[j]=temp; for(k=j+1;k<=n-1;k++) { num=map[v][line[k].end]; if(line[k].weight>num) { line[k].weight=num; line[k].begin=v; } } } return sum; } int main() { int n,m; int sum; while(scanf("%d%d",&n,&m)!=EOF) { memset(map,max,sizeof(map)); getmap(m); sum=prim(n); if(sum>max) { printf("-1\n"); } else { printf("%d\n",sum); } } return 0; }
方法二:#include<stdio.h> #include<string.h> #define max 0x3f3f3f3f #define maxn 1005 typedef struct { int begin; int end; int length; }edge; int map[maxn][maxn]; int dis[maxn]; int book[maxn]; void getmap(int m) { int i; int u,v,w; for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); map[u][v]=map[v][u]=w; } } int prim(int n) { int i,j,k; int min; int sum=0; for(i=1;i<=n;i++) { dis[i]=map[1][i]; } book[1]=1; for(i=1;i<n;i++) { min=max; for(j=1;j<=n;j++) { if(dis[j]<min&&book[j]==0) { min=dis[j]; k=j; } } book[k]=1; sum+=min; for(j=1;j<=n;j++) { if(dis[j]>map[k][j]&&book[j]==0) { dis[j]=map[k][j]; } } } return sum; } int main() { int n,m; int ans; while(scanf("%d%d",&n,&m)!=EOF) { memset(book,0,sizeof(book)); memset(map,max,sizeof(map)); getmap(m); ans=prim(n); if(ans>max) { printf("-1\n"); } else { printf("%d\n",ans); } } return 0; }