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. 界面通信之block传值

    block传值有两种方式 ⽅式⼀: 使⽤block属性实现回调传值 ⽅式⼆: 在⽅法中定义block实现回调传值 方式一比较便于理解而且常用,下面介绍方式一是如何传值的 使用block属性传值和代理传 ...

  2. python基础知识

    由于python的灵活性,赋值前无需强调变量的数据类型,并且变量的数据类型在后期的操作过程中还可以改变,故不介绍关键字,直接定义方法及可以调用的方法. I  基本数据类型 一.字符串 1.使用单引号或 ...

  3. seajs源码分析

    seajs主要做了2件事 1.定义什么是模块,如何声明模块:id.deps.factory.exports ----define=function(id,deps,factory){return ex ...

  4. Reprint: ADB is Not Recognized as an internal or external command Fix

    ADB: Android Debug Bridge http://zacktutorials.blogspot.hk/2013/04/adb-is-not-recognized-as-internal ...

  5. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  6. 【荐】PHP操作MongoDB GridFS 存储文件,如图片文件

    GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容, ...

  7. PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

    摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...

  8. 介绍一个非常好用的跨平台C++开源框架:openFrameworks

    介绍一个非常好用的跨平台C++开源框架:openFrameworks 简介 首先需要说明的一点是: openFrameworks 设计的初衷不是为计算机专业人士准备的, 而是为艺术专业人士准备的, 就 ...

  9. myecplise 中文乱码

    一.设置新建常见文件的默认编码格式,也就是文件保存的格式. 在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致 ...

  10. Android编程容易犯的错误之二

    11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了, 所以每个工程都应该有日志的开关,通过查看日志 ...