• 洛谷P2307 迷宫


    怎么又是一道叫迷宫的题呀QWQ
    题目链接
    这道题主要是对并查集的考察,需要注意的坑点在于有可能存在的不止一个联通块。
    我们只需要对输入的两个数据进行判断,如果在一个集合中证明有多条路则输出0,如果不在一个集合中就合并到同一个集合中。
    这道题的输入或许大概可能也会是坑?!qwq
    AC代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 100100
    using namespace std;
    bool sign;
    bool book;
    int f[MAXN+10];
    int done[MAXN+10];
    
    int find(int u)
    {
        if(f[u]==u) return u;
        else return f[u]=find(f[u]);
    }
    int main()
    {
        while(1)
        {
            book=0;
            memset(done,0,sizeof(done));
            for(int i=1;i<=MAXN;i++)
            {
                f[i]=i;
            }
            while(1)
            {
                int x,y;
                scanf("%d%d",&x,&y);
    //            printf("x=%d y=%d
    ",x,y);
                if(x==0)
                {
                    break;
                }
                if(x==-1)
                {
                	book=1;
                    sign=1;
                    break;
                }
                done[x]=1;
                done[y]=1;
                int a=find(x);
    //            printf("a=%d
    ",a);
                int b=find(y);
    //            printf("b=%d
    ",b);
                if(a==b&&!book)
                { 
                    book=1;
    //				printf("book=%d",book);
                    printf("0
    ");
                }
                else
                {
                    f[a]=b;
                }
            }
            if(sign) break;
            int total=0;
            for(int i=1;i<=MAXN;i++)
            {
            	if(f[i]==i&&done[i])
            	{
            		total++;
                }
            }
            if(!book&&total==1) printf("1
    ");
            if(!book&&total!=1) printf("0
    ");
        }
        return 0;
    }
    

    一开始yy了一个假算法骗了40分

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #define INF 0x3f3f3f3f
    #define MAXN 200000
    using namespace std;
    
    vector<int> G[MAXN];
    int num[MAXN];
    bool sign;
    int cur[MAXN];
    bool vis;
    queue<int> q;
    
    int main()
    {
        while(1)
        {
            int mx=0;
            memset(num,0,sizeof(num));
            memset(G,0,sizeof(G));
            memset(cur,0,sizeof(cur));
            while(1)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                if(x==0) break;
                if(x==-1)
                {
                    sign=1;
                    break;
                }
                mx=max(mx,x);
                mx=max(mx,y);
                num[x]++;
                num[y]++;
                G[x].push_back(y);
                G[y].push_back(x);
            }
            if(sign) break;
            for(int i=1;i<=mx;i++)
            {
                vis=0;
                if(num[i]!=0)
                {
                    q.push(i);
                    while(!q.empty())
                    {
                        int r=q.front();
                        q.pop();
                        for(int j=0;j<G[r].size();j++)
                        {
                            int p=G[r][j];
                            if(p==0) continue;
    //                        for(int k=0;k<G[p].size();k++)
    //                        {
    //                            if(G[p][k]==r) G[p][k]=0;
    //                        }
                            G[r][j]=0;
                            int ans=0;
                            for(int k=0;k<G[p].size();k++)
                            {
                                if(G[p][k]!=0) ans++;
                            }
                            if(ans!=0)
                            {
                                cur[p]++;
                                //printf("cur[%d]=%d",p,cur[p]);
                                if(cur[p]>1)
                                {
                                    printf("0
    ");
                                    vis=1;
                                    break;
                                }
                                q.push(p);
                            }
                        }
                        if(vis) break;
                    }
                    if(vis) break;
                }
            }
            if(!vis) printf("1
    ");
        }
        
        return 0;
    }
    
  • 相关阅读:
    sqoop
    HBase API操作
    Hbase 01-安装| shell操作
    Azkaban
    Kafka-API
    Oozie
    Kafka Manager| KafkaMonitor
    kafka工作流程| 命令行操作
    CDH| HUE的自动化安装部署
    Impala
  • 原文地址:https://www.cnblogs.com/LITTLESUNwl/p/10769439.html
Copyright © 2020-2023  润新知