HDU 1102 Constructing Roads HDU1863 畅通工程

这两个题都是畅通工程的。杭电上真是各种畅通工程。

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

还是用的Prim算法。

View Code
 1 #include<stdio.h>
 2  #include<string.h>
 3  #define N 1000000
 4  int map[110][110],lowcost[110];
 5  int visit[110];
 6  int prim(int maxminum)
 7  {
 8      int sum=0,min,k,i,j;
 9      memset(visit,0,sizeof(visit));
10      visit[1]=true;
11      for(i=1;i<=maxminum;i++)
12          lowcost[i]=map[1][i];
13      for(i=1;i<=maxminum;i++)
14      {
15          min=N;
16          for(j=1;j<=maxminum;j++)
17          {
18              if(visit[j]==0&&min>lowcost[j])
19                 {
20                     min=lowcost[j];
21                     k=j;
22                 }
23          }
24          visit[k]=1;
25          if(min==N)
26              break;
27          sum+=min;
28          for(j=1;j<=maxminum;j++)
29             {
30                 if(visit[j]==0&&lowcost[j]>map[k][j])
31                  lowcost[j]=map[k][j];
32             }
33      }
34      return sum;
35  }
36  int main()
37  {
38      int a,b,value,i,maxminum,maxmax,j,sum;
39      while(~scanf("%d",&maxminum))
40      {
41          memset(map,N,sizeof(map));
42          for(i=1;i<=maxminum;i++)
43             for(j=1;j<=maxminum;j++)
44              {
45                 scanf("%d",&value);
46                 if(value<map[i][j])
47                     map[i][j]=map[j][i]=value;
48             
49              }
50          scanf("%d",&maxmax);
51          while(maxmax--)
52          {
53              scanf("%d%d",&a,&b);
54              map[a][b]=map[b][a]=0;
55          }
56          sum=prim(maxminum);
57          printf("%d\n",sum);
58      }
59      return 0;
60  }

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

继续Prim

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 int map[110][110],lowcost[110],visit[110];
 4 #define N 9999999
 5 int maxminum,sum,maxmax;
 6 void prim()
 7  {
 8      int i,j,k,min;
 9      for(i=1;i<=maxminum;i++)
10      {
11          lowcost[i]=map[1][i];
12          visit[i]=0;
13      }
14      sum=0;
15      visit[1]=1;
16      for(i=1;i<maxminum;i++)
17      {
18          min=N;
19          for(j=1;j<=maxminum;j++)
20          {
21              if(visit[j]==0&&lowcost[j]<min)
22              {
23                  min=lowcost[j];
24                  k=j;
25              }
26          }
27          if(min==N)
28          {
29     printf("?\n");
30     return;
31    }
32    sum+=min;
33    visit[k]=1;
34          for(j=1;j<=maxminum;j++)
35          {
36              if(visit[j]==0&&map[k][j]<lowcost[j])
37              {
38                  lowcost[j]=map[k][j];
39              }
40          }
41      }
42      printf("%d\n",sum);
43  }
44  int main()
45  {
46      int i,j,a,b,value;
47      while(~scanf("%d%d",&maxmax,&maxminum))
48      {
49          if(maxmax==0)
50          break;
51          memset(map,N,sizeof(map));
52    for (i=0; i<=maxminum; i++)
53             map[i][i]=0;
54          for(i=0;i<maxmax;i++)
55          {
56              scanf("%d%d%d",&a,&b,&value);
57              if(value<map[a][b])
58              {
59                  map[a][b]=map[b][a]=value;
60              }
61          }
62          prim();
63      }
64      return 0;
65  } 

实话来说 Prim肯定不如Kruskal好用,感觉K跟并查集很像。

posted @ 2012-08-15 20:27  时光旅行的懒猫  阅读(219)  评论(0编辑  收藏  举报