zoukankan      html  css  js  c++  java
  • HDU-1232 畅通工程

    并查集.    

                        畅通工程  

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23800    Accepted Submission(s): 12381

    Problem Description
    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 注意:两个城市之间可以有多条道路相通,也就是说
    3 3
    1 2
    1 2
    2 1
    这种输入也是合法的 当N为0时,输入结束,该用例不被处理。
     
    Output
    对每个测试用例,在1行里输出最少还需要建设的道路数目。
     
    Sample Input
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
     
    Sample Output
    1
    0
    2
    998
     1 //用c++交,并查集的写法。
     2 #include<stdio.h>
     3 int fa[10010];
     4 int getroot(int p)
     5 {
     6  if(fa[p] != p)
     7   fa[p] = getroot(fa[p]);
     8  return fa[p];//找到祖先。
     9 }
    10 void init(int n)
    11 {
    12  for(int i = 1 ; i<= n ; i++)
    13  {
    14   fa[i] = i;
    15  }
    16 }
    17 int main()
    18 {
    19  int n, m,a,b,i,j;
    20  while(scanf("%d",&n)&&n!=0)
    21  {
    22   init(n);
    23   scanf("%d",&m);
    24   for(i = 0; i< m ;i++)
    25   {
    26    scanf("%d%d",&a,&b);
    27    fa[getroot(a)] = getroot(b); //畅通。
    28   }
    29   int x=0;
    30   for(i=1;i<=n;i++)
    31    for(j=1;j<=n;j++)
    32     if(getroot(i)!=getroot(j))
    33     {
    34      fa[getroot(i)] = getroot(j);
    35      x++;//不是畅通根不同,这就说明不畅通,则x++;
    36     }
    37   printf("%d
    ",x);
    38  }
    39  return 0;
    40 }

    现在问题是写的prim算法中,出现了很大的问题:
    思路是有路为0,无路为1,输出来就是要修的路:

     1 #include<stdio.h>
     2 #define N 1000 
     3 #define max 9999999
     4 int map[N][N];
     5 void prim(int n)
     6 {
     7     int i,j,u,mark[N],dis[N],cost,min;
     8     for(i=0;i<n;i++)
     9     {
    10         mark[i]=0;
    11         dis[i]=map[0][i];
    12     }
    13     mark[0]=1;
    14     cost=0;
    15     for(i=1;i<n;i++)
    16     {
    17         min=max;
    18         for(j=1;j<n;j++)
    19             if(!mark[j]&&min>dis[j])
    20             {
    21                 u=j;
    22                 min=dis[j];
    23             }
    24         mark[u]=1;
    25         cost+=min;
    26         for(j=0;j<n;j++)
    27             if(!mark[j]&&dis[j]>map[u][j])
    28                 dis[j]=map[u][j];
    29     }
    30      printf("%d
    ",cost);
    31 }
    32 int main()
    33 {
    34     int i,j,n,m,x,y;
    35      while(scanf("%d%d",&n,&m)&&n!=0)
    36      {
    37          for(i=0;i<n;i++)
    38             for(j=0;j<n;j++)
    39             {
    40                 if(i==j)
    41                     map[j][i]=map[i][j]=0;
    42                 else
    43                     map[i][j]=map[j][i]=1;
    44             }
    45             for(i=0;i<m;i++)
    46             {
    47                 scanf("%d%d",&x,&y);
    48                 map[x][y]=map[y][x]=0;
    49             }
    50         prim(n);
    51      }
    52    return 0;
    53 }


     
  • 相关阅读:
    Flex4 启动失败: 正在等待 Adobe Flash Player 连接调试器
    软件的黑盒和白盒分析方法
    PAIP.国内软件公司的现状及解决.txt
    软件逆向分析方法小结
    应用程序中主键ID生成与UUID
    JDK1.4下载 JRE1.4下载
    壳与软件保护
    数据恢复软件
    跨语言调用模块.TXT
    论文格式
  • 原文地址:https://www.cnblogs.com/cancangood/p/3310572.html
Copyright © 2011-2022 走看看