BZOJ 1626: [Usaco2007 Dec]Building Roads

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1626

赤裸裸的最次生成树,已有的边赋为0就好了,我用了prim(因为不熟)

不过有个神坑点,算坐标中乘法会超出int范围,所以在里面也要转为double(当然不排除你一开始用的就是long long)

程序:

#include<iostream>
#include<cstdio>
#include<cmath>
#define INF 2100000000.0
using namespace std;
int n,m,x[2000],y[2000];
double ans,dis[2000],f[2000][2000];
bool vis[2000];
void prim()
{
  for (int i=1;i<=n;i++)
  {
      dis[i]=INF;
      vis[i]=false;
  }
  dis[1]=0.0;
  for (;;)
  {
      int ch=0; double minx=INF;
      for (int i=1;i<=n;i++)
      if ((!vis[i])&&(dis[i]<minx))
      {
         minx=dis[i];
         ch=i;
    }
    if (ch==0) break;
    vis[ch]=true;
    ans+=dis[ch];
    for (int i=1;i<=n;i++) dis[i]=min(dis[i],f[ch][i]);
  }
}
int main()
{
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
  for (int i=1;i<=n;i++)
   for (int j=i+1;j<=n;j++)
   {
        double sum=(double)sqrt((double)(x[i]-x[j])*(double)(x[i]-x[j])+(double)(y[i]-y[j])*(double)(y[i]-y[j]));
        f[i][j]=f[j][i]=sum;
   }
  for (int i=1;i<=m;i++)
  {
      int a,b;
      scanf("%d%d",&a,&b);
      f[a][b]=f[b][a]=0.0;
  }
  prim();
  printf("%.2lf\n",ans);
  return 0;
}
时间: 2024-10-10 06:13:57

BZOJ 1626: [Usaco2007 Dec]Building Roads的相关文章

bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路 -- 最小生成树

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连. 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i,

BZOJ 1626: [Usaco2007 Dec]Building Roads 修建道路( MST )

计算距离时平方爆了int结果就WA了一次...... ----------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<cmath

[BZOJ] 1626: [Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1724  Solved: 725[Submit][Status][Discuss] Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连. 所

bzoj 1626: [Usaco2007 Dec]Building Roads 修建道路【最小生成树】

先把已有的边并查集了,然后MST即可 记得开double #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=1005; int n,m,f[N],con,tot; double x[N],y[N],ans; struct qwe { int u,v; double w; }e[N*N]; bool c

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1730  Solved: 727 [Submit][Status][Discuss] Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连.

[Usaco2007 Dec]Building Roads 修建道路[最小生成树]

Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连. 所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000:0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代

BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #

BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][Status][Discuss] Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所

Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学

1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 394  Solved: 181[Submit][Status][Discuss] Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置是一个整数点(X_i, Y_i) (-10,0