布线问题
时间限制: 1000 ms | 内存限制: 65535 KB
难度: 4
- 描述
- 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1、把所有的楼都供上电。 2、所用电线花费最少
- 输入
- 第一行是一个整数n表示有n组测试数据。(n<5) 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v<=500) 随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通) 随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 ) (楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。 数据保证至少存在一种方案满足要求。 输出
- 每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。 样例输入
-
14 61 2 102 3 103 1 101 4 12 4 13 4 11 3 5 6
样例输出 -
4 思路:prim算法水题。
1 #include
2 #include 3 #include 4 #define inf 0xfffff 5 int g[501][501]; 6 int lowcost[250000],used[250000],closet[250000]; 7 int ans; 8 void prim(int n,int a) 9 {10 int i,k,j,min;11 memset(used,0,sizeof(used));12 for(i=1;i<=n;i++)13 {14 lowcost[i]=g[i][a];15 closet[i]=a;16 }17 //for(i=1;i<=n;i++)18 //{19 //printf("lowcoset[%d]=%d ",i,lowcost[i]);20 //}21 //printf("\n");22 used[a]=1;23 for(i=1;i<=n;i++)24 {25 min=inf;26 j=a;27 for(k=1;k<=n;k++)28 {29 if(lowcost[k] g[k][j]&&!used[k])41 {42 lowcost[k]=g[k][j];43 closet[k]=j;44 }45 }46 }47 48 }49 int main()50 {51 int t,i,j,a,b,c,n,v,min,e;52 scanf("%d",&t);53 while(t--)54 {55 min=inf;56 ans=0;57 scanf("%d %d",&v,&e);58 for(i=1;i<=v;i++)59 {60 for(j=1;j<=v;j++)61 g[i][j]=inf;62 g[i][i]=0;63 }64 for(i=1;i<=e;i++)65 {66 scanf("%d %d %d",&a,&b,&c);67 if(g[a][b]>c)68 g[a][b]=g[b][a]=c;69 }70 /*for(i=1;i<=v;i++)71 {72 for(j=1;j<=v;j++)73 {74 printf("%5d ",g[i][j]);75 }76 printf("\n");77 }*/78 for(i=1;i<=v;i++)79 {80 scanf("%d",&a);81 if(a