• 杭电1879继续畅通project


    继续畅通project

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 13381    Accepted Submission(s): 5775


    Problem Description
    省政府“畅通project”的目标是使全省不论什么两个村庄间都能够实现公路交通(但不一定有直接的公路相连,仅仅要能间接通过公路可达就可以)。

    现得到城镇道路统计表。表中列出了随意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编敲代码。计算出全省畅通须要的最低成本。



    Input
    測试输入包括若干測试用例。每一个測试用例的第1行给出村庄数目N ( 1< N < 100 )。随后的 N(N-1)/2 行相应村庄间道路的成本及修建状态,每行给4个正整数,各自是两个村庄的编号(从1编号到N)。此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

    当N为0时输入结束。

    Output
    每一个測试用例的输出占一行。输出全省畅通须要的最低成本。

    Sample Input
    3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0

    Sample Output
    3
    1
    0

     

    这道题是用的最小生成树做的,和dijstra非常像

    代码:

    #include<stdio.h>
    #include<string.h>
    #define INF 1 << 30
    int map[1001][1001] ;
    int dis[1001] ;
    int used[1001] ;

    void Prim(int N)

     int i = 0 ,j = 0 ;
     int c = 0 ; 
     int sum = 0 ;//用来记录最后所须要的花费
     dis[1] = 0 ;
        for( i = 1 ; i <= N ; i++)
     {
      int min = INF ;
      for( j = 1 ; j <= N ; j++)
      {
                if(!used[j] && dis[j] < min)
       {
        min = dis[j] ;
        c = j ;
       }
      }
      used[c] = 1 ;
      for(j = 1 ; j <= N ; j++)
      {
       if(!used[j] && dis[j] > map[c][j])
        dis[j] = map[c][j] ;
      }
     }
        for(i = 1 ; i <= N ; i++)
      sum += dis[i] ;
     printf("%d ",sum);
    }

    int main()
    {
     int N = 0 ;
     while(~scanf("%d",&N))
     {
      if(N == 0)
       break ;
         int a = 0 , b = 0 , c = 0 , d = 0 ;
      int i = 0 , j = 0 ;
      for(i = 1 ; i <= N ; i++)
      {
       for(j = 1 ; j <= N ; j++)
        map[i][j] = INF ;
          dis[i] = INF ;
          used[i] = 0 ;
      }
      int m = 0 ;
      m = N*(N-1)/2 ;
      for( i = 0 ; i < m ; i++)
      {
       scanf("%d%d%d%d" , &a , &b , &c , &d );
       //当d = 1时,对于此时两点间的花费能够不用计入当中。由于已经修建了。则花费可变为0
       if( d == 1 )
        map[a][b] = map[b][a] = 0 ;
       else
       {
        //推断是否会有重边
        if(map[a][b] > c)
            map[a][b] = map[b][a] = c ; 
       }
      }
      Prim( N ) ;
     }
     return 0 ;
    }

     

  • 相关阅读:
    044 文件和数据格式化
    040 字典类型及操作
    042 实例10-文本词频统计
    Java中PreparedStatement和Statement的用法区别(转)
    java连接oracle的简单实例
    javamail发送邮件的简单实例(转)
    JAVA IO之管道流总结大全(转)
    缓冲流和转换流(转)
    使用缓冲流来读写文件(转)
    JAVA向文件中追加内容(转)
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10856451.html
  • Copyright © 2020-2023  润新知