zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    
  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/LITTLESUNwl/p/10769439.html
Copyright © 2011-2022 走看看