zoukankan      html  css  js  c++  java
  • hdu 3371 Connect the Cities (最小生成树Prim)

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

    题目不难 稍微注意一下 要把已经建好的城市之间的花费定义为0,在用普通Prim算法就可以了;我没有用克鲁斯卡尔算法(Kruskal's algorithm),因为这题数据比较大,而且要处理大量的数据使它为0,怕超时T^T。。。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 
     7 #define inf 999999
     8 
     9 int map[505][505],node[505],n,vis[505];
    10 int dd[505],sum;
    11 
    12 int Prim()
    13 {
    14     int tm=1;
    15     node[tm]=0;
    16     //vis[tm]=1;
    17     for(int k=1;k<=n;k++)
    18     {
    19         int minn=inf;
    20         for(int i=1;i<=n;i++)
    21         if(!vis[i]&&minn>node[i])
    22         {
    23             tm=i;
    24             minn=node[i];
    25         }
    26         vis[tm]=1;
    27         if(minn==inf)
    28         return 0;
    29 
    30         sum+=minn;
    31 
    32         for(int i=1;i<=n;i++)
    33         {
    34             if(!vis[i]&&node[i]>map[tm][i])
    35             node[i]=map[tm][i];
    36         }
    37     }
    38     return 1;
    39 }
    40 
    41 int main()
    42 {
    43     int T;
    44     scanf("%d",&T);
    45     while(T--)
    46     {
    47         int m,k;
    48         scanf("%d%d%d",&n,&m,&k);
    49         for(int i=1;i<=n;i++)
    50         {
    51             node[i]=inf;vis[i]=0;
    52             for(int j=1;j<=n;j++)
    53             map[i][j]=inf;
    54         }
    55         while(m--)
    56         {
    57             int a,b,d;
    58             scanf("%d%d%d",&a,&b,&d);
    59             if(map[a][b]>d)
    60             map[a][b]=map[b][a]=d;
    61         }
    62         while(k--)
    63         {
    64             int t;
    65             scanf("%d",&t);
    66             for(int i=1;i<=t;i++)
    67             {
    68                 scanf("%d",&dd[i]);
    69             }
    70             for(int i=1;i<=t;i++)
    71             {
    72                 for(int j=i+1;j<=t;j++)
    73                 map[dd[i]][dd[j]]=map[dd[j]][dd[i]]=0;
    74             }
    75         }
    76         sum=0;
    77         int flag=Prim();
    78         if(flag==0)
    79         printf("-1
    ");
    80         else
    81         printf("%d
    ",sum);
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    HTTP的GET和POST请求
    移动开发平台性能比較
    Struts2之类型转换器的使用
    对Socket CAN的理解(4)——【Socket CAN接收数据流程】
    当罗密欧遇到朱丽叶... ...当指针遇到数组
    Qt的Script、Quick、QML的关系与总结
    nyoj27水池数目 (DFS)
    HBase行锁原理及实现
    poj1852ant
    JSTL&EL表达式
  • 原文地址:https://www.cnblogs.com/mis-xiao/p/3940189.html
Copyright © 2011-2022 走看看