记录编号 |
589520 |
评测结果 |
AAAAAAAAAA |
题目名称 |
图的平方 |
最终得分 |
100 |
用户昵称 |
花火 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.137 s |
提交时间 |
2024-07-06 14:36:45 |
内存使用 |
5.93 MiB |
显示代码纯文本
#include <bits/stdc++.h> // 万能头
using namespace std;
int v,m,n; // v是顶点个数,m是范围个数,n是查询个数
vector<int> g[100005]; // 声明一个邻接表,用vector节省一些空间,实测程序总内存使用10M左右
bool jdg(int x,int y) // 传入起点x,终点y,jdg函数判断是否在x,y之间有仅包含两条边的路径
{
for(int i = 0;i < g[x].size();i++)
for(int j = 0;j < g[g[x][i]].size();j++)
if(g[g[x][i]][j] == y) return 1;
return 0;
}
/*
jdg思路:双重循环暴力枚举,第一层在x的邻接顶点中枚举一个i,
第二层在i的邻接顶点中枚举一个j,判断j是否为y
枚举成功返回1,失败返回0
*/
int main()
{
freopen("ljb.in","r",stdin); // 文件输入输出
freopen("ljb.out","w",stdout);
scanf("%d%d",&v,&m); // 读入v,m
for(int i = 0;i < m;i++)
{
int u1,u2,v1,v2;
scanf("%d%d%d%d",&u1,&u2,&v1,&v2); // 循环读入两个范围
for(int j = u1;j <= u2;j++)
for(int k = v1;k <= v2;k++)
g[j].push_back(k); // 在邻接表中添加顶点
}
scanf("%d",&n); // 读入n
for(int i = 0;i < n;i++)
{
int flag = 1; // 标记[x1,x2]到[y1,y2]中是否有枚举失败的点对,0表示有,1表示没有
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&x2,&y1,&y2); // 循环读入两个询问范围,即时判断输出
for(int j = x1;j <= x2;j++)
for(int k = y1;k <= y2;k++)
if(!jdg(j,k)) flag = 0; // 暴力枚举
if(flag) printf("Yes\n"); // 输出
else printf("No\n");
}
return 0;
}