数据结构实验之图论六:村村通公路
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。
Input
连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。
Output
输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。
Sample 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
Sample Output
19
Hint
#include <stdio.h>
#include <stdlib.h>
int f[1115];
struct node
{
int u, v;
int cost;
} q[1005];
int cmp1(const void *a,const void *b)
{
return (*(struct node *)a).cost - (*(struct node *)b).cost;
}
int getf(int u)
{
if(f[u] == u)return u;
f[u] = getf(f[u]);
return f[u];
}
void link(int u,int v)
{
int t1 = getf(f[u]),t2 = getf(f[v]);
if(t1 != t2)
{
f[t1] = t2;
}
}
int main()
{
int n,m,i,sum,j;
while(~scanf("%d %d",&n,&m))
{
sum = 0;
for(i = 1; i <= n; i++)
{
f[i] = i;
}
for(i = 0; i < m; i++)
{
scanf("%d %d %d",&q[i].u,&q[i].v,&q[i].cost);
}
if(m<n-1)
{
printf("-1\n");
}
else
{
qsort(q,m+1,sizeof(q[0]),cmp1);
for(i = 1,j = 0; i <= n-1;)
{
if(j > m)break;
if(f[q[i].u] == f[q[i].v])
{
}
else
{
link(q[i].u,q[i].v);
sum += q[i].cost;
i++;
}
j++;
}
for(i = 1; i <= n; i++)
{
//printf("%d\n",getf(f[i]));
if(getf(f[i]) != getf(f[i+1]))
{
break;
}
}
if(i != n)printf("-1\n");
else printf("%d\n",sum);
}
}
return 0;
}
Prim算法已AC
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 0x3f3f3f
int map[105][105];
int vis[105];
int dist[105];
void prim(int m)
{
int i,j,k,min,ans = 0;
for(i=1;i<= m;i++)
{
dist[i] = map[1][i];
}
vis[1] = 1;
for(i = 2;i<=m;i++)
{
min = INF;
for(j = 1;j <= m;j++)
{
if(min > dist[j] && !vis[j])
{
min = dist[j];
k = j;
}
}
if(min == INF)break;
vis[k] = 1;
ans = ans + min;
for(j = 1;j <= m;j++)
{
if(!vis[j] && dist[j] > map[k][j])
{
dist[j] = map[k][j];
}
}
}
if(i == m + 1)printf("%d\n",ans);
else
printf("-1\n");
}
int main()
{
int n,m,u,v,c,i;
while(~scanf("%d %d",&n,&m))
{
memset(map,INF,sizeof(map));
memset(vis,0,sizeof(vis));
for(i = 1;i <= n;i++)
{
map[i][i] = 0;
}
while(m--)
{
scanf("%d %d %d",&u,&v,&c);
if(map[u][v] > c)
{
map[u][v] = map[v][u] = c;
}
}
prim(n);
}
return 0;
}