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跟并查集很像。

你可能感兴趣的:(struct)