codevs 1002 搭桥 dfs+kruskal

题目:
http://codevs.cn/problem/1002/

终于调出来了;

一下午了
WA的原因:本应是if,写成了else if;
导致我一直以为没考虑全所有情况于是……我把所有情况列举出来了……266行……

思路:

dfs找联通块,然后建图跑kruskal;

难点在建图,找全所有情况!!!!

总结:

1.注意排面,多写几个函数可以省去许多功夫……

2.切记if不要写成else if!!!!!!!!!!!!!!

又长又丑的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN=201;
char ma[MAXN][MAXN];
int n,m,tot,cnt,num,ccans;
int vis[MAXN][MAXN],fa[100001];
int X[]={0,1,0,-1,0,1,1,-1,-1};
int Y[]={0,0,-1,0,1,1,-1,-1,1};
bool gra[MAXN][MAXN][MAXN];

struct hh
{
    int from,to,cost;
}mp[100001];

void init()
{
    memset(vis,0,sizeof(vis));
    return;
}

bool can(int x,int y)
{
    if(x<1 || x>n || y<1 || y>m ) return false;
    return true;
}

bool cmp(hh a,hh b)
{
    return a.cost < b.cost;
}

void build(int f,int t,int c)
{
    mp[++cnt]=(hh){f,t,c};
    return;
}


void dfs(int x,int y,int d) //找联通块; 
{
    for(int i=1;i<=8;i++)
    {
        int fx=x+X[i],fy=y+Y[i];
        if(can(fx,fy) && ma[fx][fy]=='#' && !vis[fx][fy])
            vis[fx][fy]=d,dfs(fx,fy,d);
    }
    return;
}
//----------------------------------------------------------- kruskal
int find(int x)
{
    int r=x,t;
    while(r!=fa[r]) r=fa[r];
//  while(x!=r) t=fa[x],fa[x]=r,x=t;
    return r;
}

void kruskal()
{
    for(int i=1;i<=tot+100;i++) fa[i]=i;
    sort(mp+1,mp+cnt+1,cmp);

    for(int i=1;i<=cnt;i++)
    {
        int x=mp[i].from,y=mp[i].to;
        int fx=find(x),fy=find(y);
        if(fx!=fy)
            fa[fx]=fy,num++,ccans+=mp[i].cost;
    }

    return;
}
//--------------------------------------------------------------

void build_gra()
{

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(ma[i][j]=='#')
            {
                int x=i,y=j;
                int fx=x,fy=y,step=0;
                while(can(fx+1,fy))
                {
                    fx++;
                    if(vis[fx][fy]==vis[x][y]) break;
                    else if(!vis[fx][fy]) step++;
                    else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                        build(vis[fx][fy],vis[x][y],step),
                        gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                }
                fx=x,fy=y,step=0;
                while(can(fx-1,fy))
                {
                    fx--;
                    if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                }
                fx=x,fy=y,step=0;
                while(can(fx,fy+1))
                {
                    fy++;
                    if(vis[fx][fy]==vis[x][y]) break;
                    else if(!vis[fx][fy]) step++;
                    else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                        build(vis[fx][fy],vis[x][y],step),
                        gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                }
                fx=x,fy=y,step=0;
                while(can(fx,fy-1))
                {
                    fy--;
                    if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                }
                if(x-1>=1)
                {
                    fx=x-1,fy=y,step=0;
                    while(can(fx,fy+1))
                    {
                        fy++;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                    fx=x-1,fy=y,step=0;
                    while(can(fx,fy-1))
                    {
                        fy--;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                }
                if(x+1<=n)
                {
                    fx=x+1,fy=y,step=0;
                    while(can(fx,fy+1))
                    {
                        fy++;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                    fx=x+1,fy=y,step=0;
                    while(can(fx,fy-1))
                    {
                        fy--;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                }
                if(y+1<=m)
                {
                    fy=y+1,fx=x,step=0;
                    while(can(fx+1,fy))
                    {
                        fx++;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                    fy=y+1,fx=x,step=0;
                    while(can(fx-1,fy))
                    {
                        fx--;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                }

                if(y-1>=1)
                {
                    fy=y-1,fx=x,step=0;
                    while(can(fx-1,fy))
                    {
                        fx--;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                    fy=y-1,fx=x,step=0;
                    while(can(fx+1,fy))
                    {
                        fx++;
                        if(vis[fx][fy]==vis[x][y]) break;
                        else if(!vis[fx][fy]) step++;
                        else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
                            build(vis[fx][fy],vis[x][y],step),
                            gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
                    }
                }
            }
        }
    return; 
}



void solve()
{   
    init();
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",ma[i]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(ma[i][j]=='#' && !vis[i][j])
                tot++,vis[i][j]=tot,dfs(i,j,tot);
    if(tot==1)
    {
        cout<<1<<'\n'<<0<<" "<<0<<'\n';
        return;
    }

    build_gra();

//  for(int i=1;i<=n;i++)
//  {
//      for(int j=1;j<=m;j++) cout<<vis[i][j]<<" ";
//      cout<<endl;
//  }

//  for(int i=1;i<=cnt;i++) cout<<mp[i].from<<" "<<mp[i].to<<" "<<mp[i].cost<<endl;
//  cout<<cnt<<"()()("<<endl;           
    kruskal();

    cout<<tot<<"\n";
    cout<<num<<" "<<ccans; 

    return;
}

int main()
{
    solve();
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值