首页 > 代码库 > luoguP2266 爱的距离
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+517 #define num(i,j) (i-1)*m+j18 #define ll long long19 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 }
luoguP2266 爱的距离
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。