洛谷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\n",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\n",a);
int b=find(y);
// printf("b=%d\n",b);
if(a==b&&!book)
{
book=1;
// printf("book=%d",book);
printf("0\n");
}
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\n");
if(!book&&total!=1) printf("0\n");
}
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\n");
vis=1;
break;
}
q.push(p);
}
}
if(vis) break;
}
if(vis) break;
}
}
if(!vis) printf("1\n");
}
return 0;
}
洛谷P2307 迷宫的更多相关文章
- 洛谷 P1605 迷宫
题目链接 https://www.luogu.org/problemnew/show/P1605 题目背景 迷宫 题目描述 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 ...
- 洛谷P1605 迷宫——S.B.S.
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 洛谷P1605 迷宫 (DFS)
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 洛谷P1605 迷宫【dfs】
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 洛谷P1605 迷宫
迷宫 题目链接 这道题就是一道简单的dfs计方案数qwq. 我的思路是把表初始化为1,再将障碍改为0,因为在全局定义中数组会直接初始化为0,所以就少去了对边界的特判. next数组加循环可以减少代码量 ...
- 洛谷—— P1605 迷宫
P1605 迷宫 题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在 ...
- 洛谷P1605 迷宫 深度搜索 模板!
题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...
- (Java实现) 洛谷 P1605 迷宫
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 洛谷P1309——迷宫(傻瓜DFS)
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
随机推荐
- CodeForces 30C Shooting Gallery 简单dp
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/36944227 题目链接:点击打开链接 给定 ...
- MySQL:数据库入门篇2
#移除主键时需要先解除递增,才能解除主键 alter table info modify id int null , drop PRIMARY key 一.用户权限 1.创建用户 create use ...
- ACM-ICPC(11/8)
URAL 1005 给定一些石头的重量,要求分成两个部分最相近.二进制暴力枚举. #include <bits/stdc++.h> using namespace std; ]; int ...
- Uva 10765 鸽子和炸弹
题目链接:https://vjudge.net/contest/166461#problem/B 题意: 给一个无向图,求每一个点删除后,剩下的连通块的数目: 分析: 只有割顶被删掉后,连通分量才会改 ...
- .NET MVC伪静态
说明:MVC中的伪静态跟我们的WebForm里面的伪静态不一样(详情:配置伪静态(URL重写)) 由于我们的MVC中存在路由,所以我们不必去处理每个访问的页面进行重写,我们完全可以再配置一个路由让他显 ...
- AngularJS 使用 even 和 odd 表格
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- c语言描述的双向链表的基本操作
#include<stdio.h> #include<stdlib.h> #define ok 1 #define error 0 typedef int Status; ty ...
- idea常用技巧
1.如何设置,使IntelliJ IDEA智能提示忽略大小写 打开设置(CTRL+ALT+S)搜索editor,找到“Code Completion”->点击Case sensitive com ...
- ios断点续传:NSURLSession和NSURLSessionDataTask实现
苹果提供的NSURLSessionDownloadTask虽然能实现断点续传,但是有些情况是无法处理的,比如程序强制退出或没有调用 cancelByProducingResumeData取消方法,这时 ...
- c# LRU实现的缓存类
在网上找到网友中的方法,将其修改整理后,实现了缓存量控制以及时间控制,如果开启缓存时间控制,会降低效率. 定义枚举,移除时使用 public enum RemoveType { [ ...