D - Constructing Roads

Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected.

We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.

Input

The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.

Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.

Output

You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.

Sample Input

3
0 990 692
990 0 179
692 179 0
1
1 2

Sample Output

179

刚开始用kruskal,结果tle 了,可能是我的代码写挫了吧。改为prim,wa了,改了cost[u][v]=cost[v][u]

#include<cstdio>
#include<cstring>
const int INF=0x3f3f3f;
const int MAXN=110;//看清上限
bool vis[MAXN];
int lowc[MAXN];
int cost[MAXN][MAXN];
int prim(int n)
{
  memset(vis,false,sizeof(vis));
  int ans=0;
  vis[1]=true;
  for(int i=2;i<=n;i++)
    lowc[i]=cost[1][i];
  for(int i=2;i<=n;i++)//我开始这里写成了i=1;当然一直是return -1;
  {
    int minc=INF;
    int p=-1;
    for(int j=1;j<=n;j++)
      if(!vis[j]&&lowc[j]<minc)
      {
        minc=lowc[j];
        p=j;
      }
    if(minc==INF)
      return -1;
    ans+=minc;
    vis[p]=true;
    for(int j=1;j<=n;j++)
      if(!vis[j]&&cost[p][j]<lowc[j])
        lowc[j]=cost[p][j];
  }
  return ans;
}
int main()
{
  int n;
  while(scanf("%d",&n)!=EOF)
  {
    int w;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        cost[i][j]=INF;
    for(int i=1;i<=n;i++)
    {
      lowc[i]=INF;
      for(int j=1;j<=n;j++)
      {
        scanf("%d",&w);
        if(w<cost[i][j])//只保存最小权值
        cost[i][j]=w;
      }
    }
    int m;
    scanf("%d",&m);
    int u,v;
    for(int i=1;i<=m;i++)
    {
      scanf("%d%d",&u,&v);
      cost[u][v]=cost[v][u]=0;//这里不能只写cost[u][v]=0;
    }
    int ans=prim(n);
    printf("%d\n",ans);//我忘了要\n
  }
  return 0;
}


poj_2421_mst的更多相关文章

随机推荐

  1. 20145220《Java程序设计》实验一实验报告

    *实验一 Java开发环境的熟悉 实验内容及步骤 使用JDK编译.运行简单的Java程序 命令行下程序开发: 在命令行下建立实验目录,进入该目录后创建exp1目录 敲入以下代码: package ex ...

  2. Unable to get valid context for root

    登陆时报以下错误Unable to get valid context for rootLast login: Wed Jul 24 02:06:01 2013 from 10.64.41.3 单机模 ...

  3. Unity Shader播放序列帧动画

    Shader "LordShader/AnimateSprite" { Properties { _MainTint (,,,) //颜色属性,可以在u3d inspector面板 ...

  4. TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏

    TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...

  5. Linux下串口与工业协议的开发

    1.串口通信原理 串口通信定义 串口通信:数据的串行传送方式.串口通信可分为同步通信与异步通信. 同步通信:按照软件识别同步字符来实现数据的发送和接收. 将许多字符组成一个信息组进行发送 要求发送时钟 ...

  6. c# 加密转载 备忘

    public sealed class EncryptUtils { #region Base64加密解密 /// <summary> /// Base64加密 /// </summ ...

  7. 用视频编辑软件打不开jpg格式的图片的解决方法

    有时候我们把PSD.JPG等图片导入到素材库中会发现EDIUS视频编辑软件根本就不支持,显示黑屏状态.可是当我们把图片导入EDIUS NX支持下的premierepro里却能够正常显示.这是什么原因呢 ...

  8. JSP 相关试题(一)

    选择题 1.当用户请求jsp页面时,JSP引擎就会执行该页面的字节码文件响应客户的请求,执行字节码文件的结果是(C) A)发送一个JSP源文件到客户端    B)发送一个Java文件到客户端 C)发送 ...

  9. SwiftyJSON 中文介绍

    SwiftyJSON makes it easy to deal with JSON data in Swift. Why is the typical JSON handling in Swift ...

  10. net上传图片重命名

    string FileName = File.FileName;//获取上传文件的名称 string Str = FileName.Split('.')[1];//获取上传文件的后缀 string N ...