HDU 5253(最小生成树

这题比赛的时候写挂了,WA了将近十次也没找到问题。。。。刚刚重新写了一次,mle了一次。。这题卡内存还是挺紧的,然后改了下就a了。。。比赛的时候简直背啊。。。

 1 #include<iostream>
 2 #include<map>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<vector>
 8 #define pb push_back
 9 using namespace std;
10 typedef long long ll;
11 const int maxv=1e6+40;
12 int T,cas;
13 int N,M;
14 struct edge{
15     int u,v,cap;
16 };
17 vector<edge> G;
18 int field[1005][1005];
19 int fa[maxv];
20 void initFa(){
21     for(int i=0;i<=N*M;i++) fa[i]=i;
22 }
23 int findFa(int x){
24     if(fa[x]==x) return x;
25     else return fa[x]=findFa(fa[x]);
26 }
27 bool same(int x,int y){
28     return findFa(x)==findFa(y);
29 }
30 void unite(int x,int y){
31     fa[findFa(x)]=findFa(y);
32 }
33 int kruskall(){
34     int added=0,ans=0,h=0;
35     initFa();
36     while(added<N*M-1){
37         int x=G[h].u,y=G[h].v,c=G[h].cap;
38         h++;
39         if(!same(x,y)) ans+=c,added++,unite(x,y);
40     }
41     return ans;
42 }
43 int drx[]={0,1};
44 int dry[]={1,0};
45 bool inRange(int x,int y){
46     return x>=0&&x<N&&y>=0&&y<M;
47 }
48 int getN(int x,int y){
49     return x*M+y;
50 }
51 void constuct(){
52     G.clear();
53     for(int i=0;i<N;i++){
54         for(int j=0;j<M;j++){
55             for(int k=0;k<2;k++){
56                 int dx=drx[k]+i,dy=dry[k]+j;
57                 if(inRange(dx,dy)){
58                     G.pb((edge){getN(i,j),getN(dx,dy),abs(field[i][j]-field[dx][dy])});
59                 }
60             }
61         }
62     }
63 }
64 bool cmp(edge a,edge b){
65     return a.cap<b.cap;
66 }
67 int main(){
68     cin>>T;
69     while(T--){
70         cin>>N>>M;
71         for(int i=0;i<N;i++){
72             for(int j=0;j<M;j++){
73                 scanf("%d",&field[i][j]);
74             }
75         }
76         constuct();
77         sort(G.begin(),G.end(),cmp);
78         printf("Case #%d:\n%d\n",++cas,kruskall());
79     }
80     return 0;
81 }
View Code

 

转载于:https://www.cnblogs.com/Cw-trip/p/4556909.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值