HDU 1102 Constructing Roads

这里写图片描述
这里写图片描述

题目大意:给你n*n的一个临界矩形 每个数代表的是当前i行与j列的距离 之后给你Q个连通的道路 以下Q行为哪两个村庄连通 求最小连通的距离 也就是求最小生成树

解题思路:这道题甚至已经把临界矩形都告诉你了 比模板题更要水 两种for循环输入 连通的道路距离标记为0

普利姆算法

//Memory: 252 KB   
//Time: 16 MS  
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>

using namespace std;

#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b)  memset(a,b,sizeof(a))
#define Inf 1<<29
#define N 104

int n,q,a,b;
int mp[N][N],vis[N],dis[N],cis[N][N];
int pri()
{
         int sum=0;
         FOR(i,n,1)
         {
             dis[i]=mp[1][i];
         }
         vis[1]=1;
         FOR(i,n-1,1)
         {
             int to=-1;
             int minn=Inf;
             FOR(j,n,1)
             {
             if(!vis[j]&&dis[j]<minn)
              {
                  to=j;
                  minn=dis[j];
              }
         }
         if(to==-1)
          return 0;
          vis[to]=1;
          sum+=minn;
          FOR(j,n,1)
          {
              if(!vis[j])
                dis[j]=min(dis[j],mp[to][j]);
          }
         }
         return sum;
}
int main()
{
    while(~sc(n))
    {
        lcr(vis,0);
        lcr(cis,0);
        FOR(i,n,1)
        {
            FOR(j,n,1)
            {
                mp[i][j]=Inf;
            }
        }
        FOR(i,n,1)
        {
           FOR(j,n,1)
           {
               int v;
            scanf("%d",&v);
            mp[i][j]=v;
           }
        }
        sc(q);
        while(q--)
        {
            dsc(a,b);
            mp[a][b]=0;
            mp[b][a]=0;
        }
        pr(pri());
    }
    return 0;
}

克鲁斯卡尔算法

//Memory: 332 
//Time: 79 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>

using namespace std;

#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b)  memset(a,b,sizeof(a))
#define Inf 1<<29
#define N 105

int n,v,p[N],mp[N][N];
struct node
{
    int x;
    int y;
    int l;
}q[N*N];
int Find(int x)
{
     if(x!=p[x])
     {
         p[x]=Find(p[x]);
     }
     return p[x];
}
int cmp(node a,node b)
{
    return a.l<b.l;
}
int Kruskal(int l)
{
      int sum=0;
      int to=0;
      FOR(i,l,1)
      {
          int xx=Find(q[i].x);
          int yy=Find(q[i].y);
          if(xx!=yy)
          {
              p[yy]=xx;
              sum+=q[i].l;
              to++;
              if(to==n-1)
                return sum;
          }
      }
      return sum;
}
int main()
{
    while(~sc(n))
    {
        int k=1;
        FOR(i,n,1)
        {
            p[i]=i;
            FOR(j,n,1)
            {
                sc(v);
               mp[i][j]=v;
            }
        }
        int m;
        sc(m);
        while(m--)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            mp[a][b]=0;
            mp[b][a]=0;
        }
        FOR(i,n,1)
        {
            FOR(j,n,1)
            {
                q[k].x=i;
                q[k].y=j;
                q[k++].l=mp[i][j];
            }
        }
        sort(q+1,q+k,cmp);
        int ans=Kruskal(k);
        pr(ans);
    }
    return 0;
}

END!!!!!!!!!!!!!!!!!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值