战 争时期,前线有n 个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。信使负责 在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位)。指挥部设在第一个哨所。当指挥部下达一个命令后,指挥部就派出若干个信使向与指挥部相连 的哨所送信。当一个哨所接到信后,这个哨所内的信使们也以同样的方式向其他哨所送信。直至所有n个哨所全部接到命令后,送信才算成功。因为准备充足,每个 哨所内都安排了足够的信使(如果一个哨所与其他k个哨所有通信联系的话,这个哨所内至少会配备k个信使)。
现在总指挥请你编一个程序,计算出完成整个送信过程最短需要多少时间。
1 #include <stdio.h>
2 #define MAXV 5 //最多顶点数
3 #define INF 32767 //INF表示∞无穷大
4 typedef struct //图的定义
5 {
6 int edges[MAXV][MAXV]; //邻接矩阵
7 int n,e; //顶点数,弧数
8 } MGraph; //图的邻接矩阵类型
9 int minx=0;//记录答案
10 void Prim(MGraph g,int v)
11 {
12 int lowcost[MAXV]; //顶点i是否在U中
13 int min;
14 int closest[MAXV],i,j,k;
15 for (i=0;i<g.n;i++) //给lowcost[]和closest[]置初值
16 {
17 lowcost[i]=g.edges[v][i];
18 closest[i]=v;
19 }
20 for (i=1;i<g.n;i++) //找出n-1个顶点
21 {
22 min=INF;
23 for (j=0;j<g.n;j++) //在(V-U)中找出离U最近的顶点k
24 if (lowcost[j]!=0 && lowcost[j]<min)
25 {
26 min=lowcost[j];
27 k=j; //k记录最近顶点的编号
28 }
29 minx+=min;
30 lowcost[k]=0; //标记k已经加入U
31 for (j=0;j<g.n;j++) //修改数组lowcost和closest
32 if (g.edges[k][j]!=0&&g.edges[k][j]<lowcost[j])
33 {
34 lowcost[j]=g.edges[k][j];
35 closest[j]=k;
36 }
37 }
38 }
39 int main()
40 {
41 int i,j;
42 int aa,b,z;
43 int a[5][5];
44 MGraph g;
45 scanf("%d%d",&g.n,&g.e);
46 for(i=0;i<g.n;i++)//全部赋值为无穷大,输入的会将INF覆盖掉,没有输入的不会被覆盖,表示i-j不连通
47 {
48 for(j=0;j<g.n;j++)
49 {
50 g.edges[i][j]=INF;
51 }
52 }
53 for(i=0;i<g.n;i++)//对角线赋值为0(自己到自己本身就是0)
54 {
55 g.edges[i][i]=0;
56 }
57 for(i=0;i<g.n;i++)
58 {
59 scanf("%d%d%d",&aa,&b,&z);//输入aa-b的权值
60 g.edges[aa-1][b-1]=z;
61 g.edges[b-1][aa-1]=z;
62 }
63 Prim(g,0);//调用普里姆算法
64 printf("%d\n",minx);//输出最小生成树的每条边的权值之和
65 }