Problem A

Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 31   Accepted Submission(s) : 10
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
 
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
 
Sample Input
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
 
Sample Output
3 ?
 
/****************************************/
/*---------- C++代码如下 ----------------*/
/****************************************/
 

#include <iostream>
#include <cstring>

using namespace std;

#define MaxInt 0x3f3f3f3f
#define N 110

int map[N][N],low[N],visited[N];
int n;
 
int prim()
{
    int i,j,pos,min,result=0;
    memset(visited,0,sizeof(visited));
//从某点开始,分别标记和记录该点
    visited[1]=1;pos=1;
//第一次给low数组赋值
    for(i=1;i<=n;i++)
        if(i!=pos) low[i]=map[pos][i];
//再运行n-1次
    for(i=1;i<n;i++)
    {
//找出最小权值并记录位置
     min=MaxInt;
     for(j=1;j<=n;j++)
         if(visited[j]==0&&min>low[j])
         {
             min=low[j];pos=j;
         }
   if(min==MaxInt) return -1;
//最小权值累加
    result+=min;
//标记该点
    visited[pos]=1;
//更新权值
    for(j=1;j<=n;j++)
        if(visited[j]==0&&low[j]>map[pos][j])
            low[j]=map[pos][j];
    }
    return result;
}

int main()
{
 int m,i,j,v,ans;
 while(cin>>m>>n&&m)
 {
  //所有权值初始化为最大
        memset(map,MaxInt,sizeof(map));

while(m--)
  {
   cin>>i>>j>>v;
   if(i!=j)map[i][j]=map[i][j]=v;
  }
  ans = prim();
  if(ans==-1)cout<<"?"<<endl;
     else cout<<ans<<endl;
 
 
 }
 return 0;

}

/********************************/

Problem B

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 25   Accepted Submission(s) : 14
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。当N为0时,输入结束,该用例不被处理。
 
Output
对每个测试用例,在1行里输出最小的公路总长度。
 
Sample Input
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
 
Sample Output
3 5 [hint]Hint[/hint] Huge input, scanf is recommended.
 
/****************************************/
/*---------- C++代码如下 ----------------*/
/****************************************/
 

#include <iostream>
#include <cstring>

using namespace std;

#define MaxInt 0x3f3f3f3f
#define N 110

int map[N][N],low[N],visited[N];
int n;
 
int prim()
{
    int i,j,pos,min,result=0;
    memset(visited,0,sizeof(visited));
//从某点开始,分别标记和记录该点
    visited[1]=1;pos=1;
//第一次给low数组赋值
    for(i=1;i<=n;i++)
        if(i!=pos) low[i]=map[pos][i];
//再运行n-1次
    for(i=1;i<n;i++)
    {
//找出最小权值并记录位置
     min=MaxInt;
     for(j=1;j<=n;j++)
         if(visited[j]==0&&min>low[j])
         {
             min=low[j];pos=j;
         }
   if(min==MaxInt) return -1;
//最小权值累加
    result+=min;
//标记该点
    visited[pos]=1;
//更新权值
    for(j=1;j<=n;j++)
        if(visited[j]==0&&low[j]>map[pos][j])
            low[j]=map[pos][j];
    }
    return result;
}

int main()
{
 int m,i,j,v,ans;
 while(cin>>m>>n&&m)
 {
  //所有权值初始化为最大
        memset(map,MaxInt,sizeof(map));

while(m--)
  {
   cin>>i>>j>>v;
   if(i!=j)map[i][j]=map[i][j]=v;
  }
  ans = prim();
  if(ans==-1)cout<<"?"<<endl;
     else cout<<ans<<endl;
 
 
 }
 return 0;

}

/********************************************/

Problem C

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 10   Accepted Submission(s) : 8
Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
 
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
 
Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
 
Sample Input
2 2 10 10 20 20 3 1 1 2 2 1000 1000
 
Sample Output
1414.2 oh!
 
 
/****************************************/
/*---------- C++代码如下 ----------------*/
/****************************************/
 
#include <iostream>  
#include <cmath>  
 
using namespace std; 
#define MAX 100010  
#define LEN 105  
double dist[LEN]; 
double map[LEN][LEN]; 
bool isvisited[LEN]; 
 
//点的结构体  
typedef struct Point

    double x; 
    double y; 
}Point; 
 
//初始化  
void init(){ 
    int i,j; 
    for(i=0;i<LEN;i++)

        for(j=0;j<LEN;j++)

         if(i==j) map[i][j]=0;   //对a[][]进行初始化,一般都要;  
            map[i][j]=MAX; 
        } 
    } 

 
//计算两点距离  
double caculteD(Point a,Point b)

    double len; 
    len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y)); 
    return len; 
 

 
//prim算法  
double prim(int n){ 
    int i,j,min,pos; 
    double sum=0; 
    memset(isvisited,false,sizeof(isvisited)); 
 
    //初始化  
    for(i=1;i<=n;i++){ 
        dist[i]=map[1][i]; 
    } 
 
    //从1开始  
    isvisited[1]=true; 
    dist[1]=MAX; 
 
    //找到权值最小点并记录下位置  
    for(i=1;i<n;i++){
        min=MAX; 
        //pos=-1;  
        for(j=1;j<=n;j++){ 
            if(!isvisited[j] && dist[j]<min)

                min=dist[j]; 
                pos=j; 
            }
        }   
        if(min==MAX){ 
            return -1; 
 
        } 
        sum+=dist[pos];//加上权值  
        isvisited[pos]=true; 
 
        //更新权值  
        for(j=1;j<=n;j++){ 
            if(!isvisited[j] && dist[j]>map[pos][j])

                dist[j]=map[pos][j]; 
            } 
        } 
    }   
    return sum; 

 
int main(){ 
    Point p[105]; 
    int i,j,n,nCase; 
    cin>>nCase; 
    double result;//总价  
    while(nCase--){ 
        cin>>n; 
        init(); //初始化  
        for(i=1;i<=n;i++){ 
            scanf("%lf%lf",&p[i].x,&p[i].y); 
        } 
        for(i=1;i<n;i++){ 
            for(j=i+1;j<=n;j++){   
                double len; 
                len=caculteD(p[i],p[j]); 
                if(len>=10 && len<=1000){//长度有限制  
                    map[i][j]=map[j][i]=100*len;//要*100    
                }   
            } 
        } 
        result=prim(n); 
        if(result==-1){ 
            cout<<"oh!"<<endl; 
        } 
        else{ 
            printf("%.1lf\n",result); 
        } 
    } 
     return 0; 
}
 
 
/**********************************************/
 

Problem D

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 15   Accepted Submission(s) : 6
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
 
 
 
/****************************************/
/*---------- C++代码如下 ----------------*/
/****************************************/
 

#include <iostream>
#include <cstring>

using namespace std;
#define MaxInt 0x3f3f3f3f
#define N 110

int map[N][N],low[N],visited[N];

int n;
 
int prim()
{
    int i,j,pos,min,result=0;
    memset(visited,0,sizeof(visited));

visited[1]=1;pos=1;

for(i=1;i<=n;i++)
        if(i!=pos) low[i]=map[pos][i];

for(i=1;i<n;i++)
    {
 
     min=MaxInt;
 
     for(j=1;j<=n;j++)
  {
  
    if(visited[j]==0&&min>low[j])
         {
             min=low[j];pos=j;
         }
 }

if(min!=MaxInt)
  result+=min;

visited[pos]=1;

for(j=1;j<=n;j++)
        if(visited[j]==0&&low[j]>map[pos][j])
            low[j]=map[pos][j];
    }
    return result;
}
 
int main()
{
    int i,v,j,ans,c,t;
    while(scanf("%d",&n)!=EOF&&n)
    {

memset(map,MaxInt,sizeof(map));
        for(t=1;t<=n*(n-1)/2;t++)
        {
 scanf("%d%d%d%d",&i,&j,&v,&c);
            if(c==0)map[i][j]=map[j][i]=v;
    else map[i][j]=map[j][i]=0;
         }
            ans=prim();
    printf("%d\n",ans);
  
    }
 
    return 0;
}

/*******************************/

Problem E

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 6   Accepted Submission(s) : 4
Problem Description
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends are not interested in his picture.Eddy feels very puzzled,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you. Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?
 
Input
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point. Input contains multiple test cases. Process to the end of file.
 
Output
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points.
 
Sample Input
3 1.0 1.0 2.0 2.0 2.0 4.0
 
Sample Output
3.41
 
 
/****************************************/
/*---------- C++代码如下 ----------------*/
/****************************************/
 
#include <iostream>  
#include <cmath>  
 
using namespace std; 
#define MAX 100010  
#define LEN 105  
double dist[LEN]; 
double map[LEN][LEN]; 
bool isvisited[LEN]; 
 
//点的结构体  
typedef struct Point

    double x; 
    double y; 
}Point; 
 
//初始化  
void init()

    int i,j; 
    for(i=0;i<LEN;i++){ 
        for(j=0;j<LEN;j++){ 
         if(i==j) map[i][j]=0;   //对a[][]进行初始化,一般都要;  
            map[i][j]=MAX; 
        } 
    } 

 
//计算两点距离  
double caculteD(Point a,Point b)

    double len; 
    len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y)); 
    return len; 
 

 
//prim算法  
double prim(int n)

    int i,j,min,pos; 
    double sum=0; 
    memset(isvisited,false,sizeof(isvisited)); 
 
    //初始化  
    for(i=1;i<=n;i++)

        dist[i]=map[1][i]; 
    } 
 
    //从1开始  
    isvisited[1]=true; 
    dist[1]=MAX; 
 
    //找到权值最小点并记录下位置  
    for(i=1;i<n;i++)
{
        min=MAX; 
        //pos=-1;  
        for(j=1;j<=n;j++){ 
            if(!isvisited[j] && dist[j]<min)

                min=dist[j]; 
                pos=j; 
            }
        }   
        if(min==MAX)

            return -1; 
 
        } 
        sum+=dist[pos];//加上权值  
        isvisited[pos]=true; 
 
        //更新权值  
        for(j=1;j<=n;j++){ 
            if(!isvisited[j] && dist[j]>map[pos][j])

                dist[j]=map[pos][j]; 
            } 
        } 
    }   
    return sum; 

 
int main()

    Point p[105]; 
    int i,j,n; 
    double result; 
    double len;
    while(cin>>n)
    { 
        init(); //初始化  
        for(i=1;i<=n;i++){ 
            scanf("%lf%lf",&p[i].x,&p[i].y); 
        } 
        for(i=1;i<n;i++)
        { 
            for(j=i+1;j<=n;j++)
            {   
                len=caculteD(p[i],p[j]); 
                map[i][j]=map[j][i]=len;
            } 
        } 
        result=prim(n); 
        printf("%.2lf\n",result); 
        } 
     
     return 0; 
}
 
/***********************************/
 
 
 
 
 
 
 
 
 

最小生成树のprim算法的更多相关文章

  1. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  2. 最小生成树Prim算法(邻接矩阵和邻接表)

    最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...

  3. 最小生成树—prim算法

    最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...

  4. Highways POJ-1751 最小生成树 Prim算法

    Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...

  5. SWUST OJ 1075 求最小生成树(Prim算法)

    求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...

  6. 图论算法(五)最小生成树Prim算法

    最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...

  7. 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析

    最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...

  8. 最小生成树——prim算法

    prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...

  9. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  10. 求最小生成树(Prim算法)(1075)

    Description 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经给出了部分代码,你只需要完善Prim算法即可. Input 第一行为图的顶点个数n    ...

随机推荐

  1. tyvj1106 登山

    背景     在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结……    不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴 ...

  2. SpringMVC Controller介绍

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  3. Java四种线程池的使用

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...

  4. 6个变态的C语言Hello World程序

    6个变态的C语言Hello World程序   下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C+ ...

  5. 批量删除 svn文件

    windows下批量删除SVN的方法 ============================ 在.svn的同级目录,也就是项目的根目录 新建文件 killsvn.bat 输入内容: @echo on ...

  6. Microsoft.AspNet.SignalR 2.2

    Nuget :http://www.nuget.org/packages/Microsoft.AspNet.SignalR/ What is SignalR? ASP.NET SignalR is a ...

  7. 我常用的find命令

    查找某种类型文件中包含特定字符的文件 find /* -type f -name "*.php" |xargs grep "rename(" find ./|x ...

  8. yii 常用的多表查询

    return $this->model()->getDbConnection()->createCommand() ->select("t.type,t.title, ...

  9. 自定义RatingBar,不同分辨率屏幕下图片拉伸或者显示不完整问题解决

    1.需要两张评分图片ic_rating_highlight.png ic_rating_normal_white.png(宽高都是52px,且有内边距)  将这两张图片添加到各分辨率文件夹下  开发过 ...

  10. WebConfig配置

    安全配置示例 https://msdn.microsoft.com/zh-cn/magazine/gg309184.aspx