zoukankan      html  css  js  c++  java
  • 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:
    %d
    ",++cas,kruskall());
    79     }
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    模拟赛QAQ
    复习计划
    luogu P1080 国王游戏
    [NOIP2012T3]开车旅行
    luogu P1967 货车运输
    同余方程组的扩展欧几里得解法
    luogu P1476 休息中的小呆
    GRYZY #13. 拼不出的数
    GRYZY- #10. 财富
    GRYZY #8. 公交车
  • 原文地址:https://www.cnblogs.com/Cw-trip/p/4556909.html
Copyright © 2011-2022 走看看