POJ 1251 Jungle Roads

考查点:最小生成树
提交情况:一次AC
AC_Code:
  1. #include <iostream>
  2. #define MAX 27
  3. #define MAXCOST 101
  4. using namespace std;
  5. int vertices[MAX],lowcost[MAX],minv,totalcost;
  6. int edges[MAX][MAX];
  7. bool visited[MAX];
  8. int prim(int vertex_num,int v)
  9. {
  10.     totalcost=0;
  11.     visited[v]=true;
  12.     for(int i=0;i<vertex_num;i++)
  13.         lowcost[i]=edges[v][i];
  14.     for(int i=1;i<vertex_num;i++)
  15.     {
  16.         minv=MAXCOST;
  17.         //for选出从U中顶点到V-U中顶点的最小权值,每次从第一个开始
  18.         //这样如果碰到边界顶点时,可以回到另外的点
  19.         for(int j=0;j<vertex_num;j++)
  20.             if(visited[j]==false&&lowcost[j]<minv)//lowcost[j]是从顶点v到顶点j的权值
  21.             {
  22.                 minv=lowcost[j];
  23.                 v=j;
  24.             }
  25.         visited[v]=true;
  26.         totalcost+=minv;
  27.         for(int j=0;j<vertex_num;j++)
  28.             if(visited[j]==false&&edges[v][j]<lowcost[j])
  29.                 lowcost[j]=edges[v][j];
  30.     }
  31.     return totalcost;
  32. }
  33. int main()
  34. {
  35.     int num,degree,cost;
  36.     char vertex;
  37.     while(cin>>num)
  38.     {
  39.         if(num==0) break;
  40.         for(int i=0;i<num;i++) vertices[i]=i;
  41.         for(int i=0;i<num;i++)
  42.             for(int j=0;j<num;j++)
  43.                 edges[i][j]=MAXCOST;
  44.         for(int i=0;i<num;i++) visited[i]=false;
  45.         for(int i=0;i<num-1;i++)
  46.         {
  47.             cin>>vertex>>degree;
  48.             for(int j=0;j<degree;j++)
  49.             {
  50.                 cin>>vertex>>cost;
  51.                 edges[i][vertex-'A']=cost;
  52.                 edges[vertex-'A'][i]=cost;
  53.             }
  54.         }
  55.         cout<<prim(num,0)<<endl;
  56.     }
  57.     return 0;
  58. }
小感:
第一次做图论题目,而且一次就AC了,挺兴奋的,呵呵。当然,还有很多不是非常明白的地方,对算法很细节的执行还没有非常明白~还有就是,Prim算法的过程好像是选出一个点后,找该点与剩下的点的权值的最小值,而不是所有在U中的点与V-U中的点的最小值。开始时觉得应该是所有U中的与V-U中最小的值的~还得再看看~
这里用了Prim求最小生成树,图是用邻接矩阵表示的,算法复杂度为O(n 2),其实看书上的例子,是用邻接表实现的,而且用到了最小堆求权值最小的边,最后的复杂度为O(elog 2e),e为边数。总的过程是从V-U中选出到U中权值最小的点,并加到U,之后更新lowcost,被更新的lowcost只是在V-U中的。
还有就是关于scanf,开始时用,可是在输入的时候有问题,不知道怎么回事~看别人也都说scanf会RE等的,于是用了cin,结果0MS就可以过了~还有,也看到有人说用了26时,RE了,所以我就改成27了,也不知道26到底会不会错~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值