• luoguP2266 爱的距离


    题目:http://www.luogu.org/problem/show?pid=2266

    题解:感觉题意不清,就去瞅题解了T_T

            然后发现好水。。。

            类似于MST,我们把边从小到大加进去就可以了。 

            每加入一条边,判断是否符合条件,统计一下ans。

            程序的具体实现有一些技巧

            注释写在代码里

    代码:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<string>
     7 #include<set>
     8 #include<map>
     9 #include<vector>
    10 #include<algorithm>
    11 #include<queue>
    12 #define for0(i,n) for(int i=0;i<=n;i++)
    13 #define for1(i,n) for(int i=1;i<=n;i++)
    14 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    15 #define for3(i,y,x) for(int i=(y);i>=(x);i--)
    16 #define maxn 1000000+5
    17 #define num(i,j) (i-1)*m+j
    18 #define ll long long
    19 using namespace std;
    20 inline ll read()
    21 {
    22     ll x=0,f=1;char ch=getchar();
    23     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    24     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    25     return x*f;
    26 }
    27 ll n,m,k,tot,f[maxn],g[maxn],fa[maxn],v[maxn],a[1000][1000];
    28 struct edge{int x,y;ll w;}e[2*maxn];
    29 inline bool cmp(edge a,edge b){return a.w<b.w;}
    30 inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    31 int main()
    32 {
    33     freopen("input.txt","r",stdin);
    34     freopen("output.txt","w",stdout);
    35     n=read();m=read();k=read();
    36     for1(i,n)for1(j,m)a[i][j]=read(),fa[num(i,j)]=num(i,j),f[num(i,j)]=1;//f[x]表示x集合内有多少点 
    37     for1(i,n)for1(j,m)g[num(i,j)]=read();//g[x]表示集合x内有多少个需要统计答案的点 
    38     for1(i,n)for1(j,m)
    39     {
    40         if(i<n)e[++tot].x=num(i,j),e[tot].y=num(i+1,j),e[tot].w=abs(a[i][j]-a[i+1][j]);
    41         if(j<m)e[++tot].x=num(i,j),e[tot].y=num(i,j+1),e[tot].w=abs(a[i][j]-a[i][j+1]);//连边 
    42     }
    43     sort(e+1,e+tot+1,cmp);//排序 
    44     ll ans=0;
    45     for1(i,tot)
    46     {
    47         int x=find(e[i].x),y=find(e[i].y);
    48         if(x!=y)
    49         {
    50             if(f[x]+f[y]>=k)
    51             {
    52                 if(!v[x])ans+=(ll)g[x]*(ll)e[i].w,v[x]=1;//v[x]表示以x为代表元的集合的答案是否计算过 
    53                 if(!v[y])ans+=(ll)g[y]*(ll)e[i].w,v[y]=1;
    54             }
    55             fa[x]=y;f[y]+=f[x];g[y]+=g[x];//合并 
    56         }
    57     }
    58     cout<<ans<<endl;
    59     return 0;
    60 }
    View Code
  • 相关阅读:
    ASP.NET Core项目解读之常用概念方法
    ASP.NET Core项目解读之appsettings.json
    ASP.NET Core项目解读之wwwroot
    ASP.NET Core项目解读之launchSettings.json
    理解.NET5
    搜索引擎学习(四)中文分词器
    搜索引擎学习(五)Lucene操作索引
    搜索引擎学习(三)Lucene查询索引
    搜索引擎学习(二)Lucene创建索引
    搜索引擎学习(一)初识Lucene
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4070911.html
Copyright © 2020-2023  润新知