BestCoder Round #77 (div.2) C India and China Origins

很早的题目了,那天没打。 补题,不会,瞄了一眼题解,用并查集做。。
后面就出来了。。
还算简单的并查集。。
切合生活的题目,感觉就是不错的题目。。

从后往前来
首先判断两国在最后是不是一直在一起,就是构建初始状态的连通性。我从上到下,从左到右一行一行来,比如判断(x,y)点时,我就看(x,y-1)点(x==0特判)和(x-1, y)。
注意:千万注意(x,y)的父节点会变化的,所以每次都要find;

后面就往前来了,对于每个点4周接通一下。每次搞完,就判断终边和起始边的关系。。 解决了

细节。好像不能写div这个单词作为变量。。反正我的cb编译不过。。
然后数组开小了,导致Runtime Error (STACK_OVERFLOW)。。

虽然以前有做过,但是一个月后玩居然没有1A ORZ。。。

还有,去省赛的米娜桑加油!!!!!!!
我去吃饭喽!

#include<cstring>
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 550
int city[maxn*maxn];
int find(int x)
{
    if(city[x]==x)
        return x;
    else
        return city[x]=find(city[x]);
}
int div1[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
char map1[maxn][maxn];
struct sb
{
    int x;
    int y;
}year[maxn*maxn];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<=n*m;i++)
        {
            city[i]=i;
        }
        for(int i=0;i<n;i++)
        {
            cin>>map1[i];
        }
        int years;
        cin>>years;
        for(int i=1;i<=years;i++)
        {
            cin>>year[i].x>>year[i].y;
            map1[year[i].x][year[i].y]='1';
        }
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(map1[i][j]!='1')
                {
                    if(map1[i-1][j]!='1')
                    {
                        int f1=find(i*m+j);
                        int f2=find((i-1)*m+j);
                        if(f1!=f2)
                        {
                            if(f1>f2)
                                city[f1]=f2;
                            else
                                city[f2]=f1;
                        }
                    }
                    if(j!=0&&map1[i][j-1]!='1')
                    {
                        int f1=find(i*m+j);
                        int f2=find(i*m+j-1);
                        if(f1!=f2)
                        {
                            if(f1>f2)
                                city[f1]=f2;
                            else
                                city[f2]=f1;
                        }
                    }
                }
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(city[(n-2)*m+i]<m)
            {
                ans=-1;
                break;
            }
        }
        if(ans==-1)
        {
            cout<<-1<<endl;
            continue;
        }
        for(int i=years;i>=1;i--)
        {
            int x=year[i].x;
            int y=year[i].y;
            map1[x][y]='0';
            int f1=find(x*m+y);
            for(int j=0;j<4;j++)
            {
                int newx=x-div1[j][0];
                int newy=y-div1[j][1];
                if(newx<0||newy<0||newx>=n||newy>=m||map1[newx][newy]=='1')
                    continue;
                int f2=find(newx*m+newy);
                if(f1>f2)
                {
                    city[f1]=f2;
                    f1=find(x*m+y);
                }
                else
                {
                    city[f2]=f1;
                    f1=find(x*m+y);
                }
            }
            for(int j=0;j<m;j++)
            {
                if(find((n-2)*m+j)<m)
                {
                    ans=i;
                    break;
                }
            }
            if(ans)
                break;
        }
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(bc,并查集)