zoukankan      html  css  js  c++  java
  • HDU-1879 继续畅通工程

                                继续畅通工程

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

    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
     
    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
     
    Author
    ZJU
     
    Source
     
     prim算法
     1 #include<stdio.h>
     2 int  map[101][101],visit[101];
     3 int length[101];
     4 int getmin(int n)//prim算法模板。
     5 {
     6     int i,min;
     7     for(i=1;i<=n;i++)
     8     {
     9         if(visit[i]==0)
    10         {
    11             min=i;
    12             break;
    13         }
    14     }
    15    for(i++;i<=n;i++)
    16    {
    17        if(visit[i]==0&&length[min]>length[i])
    18            min=i;
    19    }
    20    return min;
    21 }
    22 int prim(int n)
    23 {
    24     int i,j;
    25     int min;
    26     int sum;
    27     for(i=1;i<=n;i++)
    28     {
    29         visit[i]=0;
    30         length[i]=map[1][i];
    31     }
    32       visit[1]=1;
    33        sum=0;
    34      for(i=2;i<=n;i++)
    35      {
    36          min=getmin(n);
    37          visit[min]=1;
    38          sum+=length[min];
    39          for(j=1;j<=n;j++)
    40          {
    41              if(visit[j]==0)
    42              {
    43                  if(map[min][j]<length[j])
    44                  {
    45                      length[j]=map[min][j];
    46                  }
    47              }
    48          }
    49      }
    50      return sum;
    51 }
    52 int main()  
    53 {  
    54     int n, m;  
    55     int i;  
    56     int min;  
    57     int u, v, cost, tag;  
    58     while (scanf("%d", &n) != EOF && n != 0)  
    59     {  
    60         m = n * (n - 1) / 2;  
    61         for (i = 0; i <= n; i++)  
    62             map[i][i] = 0;  
    63         for (i = 0; i < m; i++)  
    64         {  
    65             scanf("%d%d%d%d", &u, &v, &cost, &tag);  
    66             if (tag == 1)  
    67             {  
    68                 map[u][v] = 0;  
    69                 map[v][u] = 0;  //有道路的就为0,算是最短,也会加进去。
    70             }  
    71             else 
    72             {  
    73                 map[u][v] = cost;  
    74                 map[v][u] = cost;  
    75             }  
    76         }  //建个道路图。
    77         min = prim(n);  
    78         printf("%d
    ", min);  
    79     }
    80     return 0;
    81 }  

     浓缩prim的模板,也一下子过了。

    #include<stdio.h>
    #include<string.h>
    #define MAX 1000000
    int map[510][510];
    void prim(int n)//最好的prim的模板。
    {
    	int k[510],v[510],i,j;
    	int min,sum=0,flag,count=1;
    	memset(k,0,sizeof(k));
    	memset(v,0,sizeof(v));
    	for(i=1;i<=n;i++)
    		k[i]=map[1][i];
    	for(i=2;i<=n;i++)
    	{
    		min=MAX;
    		for(j=2;j<=n;j++)
    		{
    			if(min>k[j]&&v[j]==0)
    			{
    				min=k[j];
    				flag=j;
    			}
    		}
    		sum+=min;
    		v[flag]=1;
    		for(j=1;j<=n;j++)
    			if(v[j]==0&&k[j]>map[flag][j]&&flag!=j)
    				k[j]=map[flag][j];
    	}
         printf("%d
    ",sum);
    }
    int main()
    {
    	int n,m,k,i,j,p,q,r,s;
    	int b[100];
    
    	while(~scanf("%d",&n)&&n!=0)
    	{
    		m=n*(n-1)/2;
    		for(i=1;i<=n;i++)
    			for(j=1;j<=n;j++)
    			{
    				if(i==j) map[i][j]=0;
    				else 
    					map[i][j]=MAX;
    			}
    			for(i=0;i<m;i++)
    			{
    				scanf("%d%d%d%d",&p,&q,&r,&k);
    					if(k==1)
                        map[p][q]=map[q][p]=0;
    					else
    			         map[p][q]=map[q][p]=r;
    			
    			}
    		prim(n);
    	}
    	return 0;
    }
    
  • 相关阅读:
    ColorDialog 组件
    HTTP 错误 404.3
    iis服务器401.3 ACL访问权限问题
    python并发编程(进程操作)
    python并发编程(一些基本概念)
    python网络编程二
    python 网络编程
    python 异常处理
    python模块(hashlib,configparse,logging)
    python面向对象进阶
  • 原文地址:https://www.cnblogs.com/cancangood/p/3296353.html
Copyright © 2011-2022 走看看