HDU 1879 继续畅通工程

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1879

还是最小生成树的模板题

我用的Prim算法

View Code
 1 #include<stdio.h>
 2  #include<string.h>
 3  int map[110][110],lowcost[110],visit[110];
 4  #define N 1000000
 5  int prim(int maxminum)
 6  {
 7      int i,sum,j,k,min;
 8      for(i=1;i<=maxminum;i++)
 9      {
10          lowcost[i]=map[1][i];
11          visit[i]=0;
12      }
13      sum=0;
14      visit[1]=1;
15      for(i=1;i<maxminum;i++)
16      {
17          min=N;
18          for(j=1;j<=maxminum;j++)
19          {
20              if(visit[j]==0&&lowcost[j]<min)
21              {
22                  min=lowcost[j];
23                  k=j;
24              }
25          }
26         
27          if(min==N)
28          break;
29    visit[k]=1;
30          sum+=min;
31          for(j=1;j<=maxminum;j++)
32          {
33              if(visit[j]==0&&map[k][j]<lowcost[j])
34              {
35                  lowcost[j]=map[k][j];
36              }
37          }
38      }
39      return sum;
40  }
41  int main()
42  {
43      int maxmax,maxminum,i,a,b,value,sum,flag;
44      while(~scanf("%d",&maxminum))
45      {
46          if(maxminum==0)
47          break;
48          memset(map,N,sizeof(map));
49          maxmax=(maxminum*(maxminum-1))/2;
50    for(i=1;i<=maxminum;i++)
51              map[i][i]=0;
52          for(i=1;i<=maxmax;i++)
53          {
54              scanf("%d%d%d%d",&a,&b,&value,&flag);
55     if(flag==0)
56              {
57      if(value<map[a][b])
58              {
59                  map[a][b]=map[b][a]=value;
60              }
61     }
62     else
63     {
64      map[a][b]=map[b][a]=0;
65     }
66          }
67          sum=prim(maxminum);
68          printf("%d\n",sum);
69      }
70      return 0;
71  }
posted @ 2012-08-15 20:19  时光旅行的懒猫  阅读(193)  评论(0编辑  收藏  举报