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. eclipse中 linked resource的使用

    一.关于linked resource   eclipse 中的linkded resources 是指存放在项目所在位置以外某个地方的文件或者文件夹:这些特定的资源必须有一个项目作为他们的父资源.l ...

  2. R包igraph探究

    前段时候由于项目的原因,需要画图,然后开始接触R语言的igraph包,网上零零散散的搜罗了不少的信息,放在这边交流分享的同时也给自己留个备份吧~ 1.首先是读取文件,基本选用的都是csv文件 edge ...

  3. Bash 的 no-fork 优化

    我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序.fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 ...

  4. Mysql 建立索引

  5. 浅谈JSON

    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式,为什么没有 ...

  6. css浏览器兼容问题

    https://www.douban.com/group/topic/4629864/

  7. 更改CentOS 6.3 yum源为国内163源

    CentOS5.x: http://mirrors.163.com/.help/CentOS5-Base-163.repo CentOS6.x: http://mirrors.163.com/.hel ...

  8. 多重网格法简介(Multi Grid)

    原文链接 多重网格法是一种用于求解方程组的方法,可用于插值.解微分方程等. 从专业角度讲多重网格法实际上是一种多分辨率的算法,由于直接在高分辨率(用于求解的间隔小)上进行求解时对于低频部分收敛较慢,与 ...

  9. QuickSort 快速排序 基于伪代码实现

    本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...

  10. 开大你的音响,感受HTML5 Audio API带来的视听盛宴

    话说HTML5的炫酷真的是让我爱不释手,即使在这个提到IE就伤心不完的年代.但话又说回来,追求卓越Web创造更美世界这样高的追求什么时候又与IE沾过边儿呢?所以当你在看本文并且我们开始讨论HTML5等 ...