十一届河南省赛-checkpoints(个人解法)-能AC代码
大致题意:
zznuoj,大致题意:从A点出发达到B点去解救人质,再从B点返回到A点,经历第二遍的点只计算一次即可,AB两点不计数!求完成任务最少需要经过的点数。
大致思路:暴力!从起点到终点,和从终点到起点这两趟路其实恰好可以分开,互不影响地进行取并集计算找最佳值!
BFS枚举前1000条从起点A到终点B的路径(仅统计每种搜索的经过的点数)进set1,然后反之再搜索一次再统计一遍存进set2!然后两两求出交集后取并集最小的哪一个就是结果。
当然BFS时要舍远求近,仅保留前1000个最短的路径,两次bfs其实步骤一样——对调起点和终点即可!
优化:set<int>mp1[N]; //可替换成bool,再开一个bool数组再进行比较。
题解:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
#define inf 0x3f3f3f3f
#define N 108
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a)) ///peace keeper set<int>mp1[N]; //可替换成bool,再开一个bool数组再进行比较
set<int>mp2[N]; vector<int>a[N]; int n,m,A,B;
int val[N];
bool vis[N];
struct node{
int x,step; //x表示当前的走到的那个的点,step表示抵达当前点走过的步数。
bool vis[N]; //统计抵达当前点x的所有点
bool operator< (const node &p)const{
return p.step<step;///step小的先出去
};
};
void debug(bool y[],int n){
for(int i=;i<=n;i++)
printf(" %d",y[i]);
cout<<endl;
}
int bfs1(int A,int B,int n){
queue<node>Q;
node st,next,now;
st.x=A;st.step=;mem(st.vis,);st.vis[A]=;
Q.push(st);
int cnt=; while(Q.size()>){
now=Q.front();
Q.pop();
if(cnt>=)break ;
for(int i=;i<(int)a[now.x].size();i++){
int v=a[now.x][i];
// printf("%d->%d\n",now.x,v);
if(!now.vis[v])
{
next=now;
next.vis[v]=; next.x=v;next.step=now.step+;
/// debug(next.vis,n);
if(v==B){
cnt++;
mp1[cnt].clear();
for(int j=;j<=n;j++)
{
if(next.vis[j])mp1[cnt].insert(j);
}
continue;
} Q.push(next);
}
}
}
return cnt;
}
int bfs2(int A,int B,int n){ //反向搜索一波,找寻N条最短路
queue<node>Q;
node st,next,now;
st.x=B;st.step=;mem(st.vis,);st.vis[B]=;
Q.push(st);
int cnt=; while(Q.size()>){
now=Q.front();
Q.pop();
if(cnt>=)break ;
for(int i=;i<(int)a[now.x].size();i++){
int v=a[now.x][i];
// printf("%d->%d\n",now.x,v);
if(!now.vis[v])
{
next=now;
next.vis[v]=;
next.x=v;next.step=now.step+;
if(v==A){
cnt++;
mp2[cnt].clear();
for(int j=;j<=n;j++)
{
if(next.vis[j])mp2[cnt].insert(j);
}
continue;
}
Q.push(next);
}
}
}
return cnt;
} int solve(int cnt1,int cnt2){ int ans=inf;
for(int i=;i<=cnt1;i++){
for(int j=;j<=cnt2;j++){
set<int>mp;
set<int>::iterator it;
for(it=mp1[i].begin();it!=mp1[i].end();++it){
mp.insert(*it);
// printf("[%d] ",*it);
}
// cout<<" *** ";
for(it=mp2[j].begin();it!=mp2[j].end();++it){
mp.insert(*it);
// printf("(%d) ",*it);
}
ans=min(ans,(int)mp.size());
// cout<<endl;
}
}
return ans-;
} int main(){ int T;
cin>>T;
while(T--){
scanf("%d%d%d%d",&n,&m,&A,&B);
int xi,yi;
// memset(val,inf,sizeof(val));
for(int i=;i<=n;i++)
a[i].clear(); for(int i=;i<=m;i++)
{
scanf("%d %d",&xi,&yi);
a[xi].push_back(yi);
}
if(A==B){
printf("0\n");continue;
}
int cnt1=bfs1(A,B,n);
int cnt2=bfs2(A,B,n); printf("%d\n",solve(cnt1,cnt2));
} return ;
}
十一届河南省赛-checkpoints(个人解法)-能AC代码的更多相关文章
- 2018省赛赛第一次训练题解和ac代码
第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title A CodeForces 607A Chain Reaction B CodeForces ...
- 2018天梯赛第一次训练题解和ac代码
随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS Memory Limit: ...
- 第八届河南省赛D.引水工程(kruthcra+prime)
D.引水工程 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 118 Solved: 41 [Submit][Status][Web Board] D ...
- 第七届河南省赛G.Code the Tree(拓扑排序+模拟)
G.Code the Tree Time Limit: 2 Sec Memory Limit: 128 MB Submit: 35 Solved: 18 [Submit][Status][Web ...
- POJ-2421Constructing Roads,又是最小生成树,和第八届河南省赛的引水工程惊人的相似,并查集与最小生成树的灵活与能用,水过~~~
Constructing Roads Time Limit: 2000MS Memory Limit: 65536K Description There are N v ...
- 第七届河南省赛10403: D.山区修路(dp)
10403: D.山区修路 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 69 Solved: 23 [Submit][Status][Web Bo ...
- 第八届河南省赛F.Distribution(水题)
10411: F.Distribution Time Limit: 1 Sec Memory Limit: 128 MB Submit: 11 Solved: 8 [Submit][Status] ...
- 第七届河南省赛10402: C.机器人(扩展欧几里德)
10402: C.机器人 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 53 Solved: 19 [Submit][Status][Web Boa ...
- 第八届河南省赛G.Interference Signal(dp)
G.Interference Signal Time Limit: 2 Sec Memory Limit: 128 MB Submit: 35 Solved: 17 [Submit][Status ...
随机推荐
- 思科S系列220系列交换机多个漏洞预警
补天漏洞响应平台近期监测思科官方发布了关于思科 S 系列 220 系列交换机的3个漏洞修复通告,其中包含2个高危漏洞,最高CVSS 3.0评分9.8. 更新时间 2019年 08月 09日 威胁目标 ...
- 字符编码笔记:ASCII,Unicode 和 UTF-8(理解)
1.ASCII 码 美国制定的字符编码规则,对英语字符与二进制位之间的关系做了统一规定. 占一个字节,8 位,最多可表示 2^8 = 256 种状态(字符) 实际共有 128 个字符,只占用一个字节的 ...
- 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱
题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...
- 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...
- SQL SERVER YEAR函数
定义: YEAR函数返回指定日期的年的部分 语法: YEAR(date) 参数: ①date参数是合法的日期表达式. 返回值: int型数据 例: 声明:本文是本人查阅网上及书籍等各种资料,再加上自 ...
- LeetCode 第 167 场周赛
1290.二进制链表转整数 1291.顺次数 1292.元素和小于等于阈值的正方形的最大边长 1293.网格中的最短路径 1290.二进制链表转整数 1290.二进制链表转整数 给你一个单链表的引用结 ...
- 如何拿到美团offer的
美团,我是在拉勾网上投的简历,之前也投过一次,简历都没通过删选,后来让学姐帮我改了一下简历,重新投另一个部门,获得了面试机会.10月23日,中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我 ...
- 第八章 ZYNQ-MIZ701 软硬调试高级技巧
软件和硬件的完美结合才是SOC的优势和长处,那么开发ZYNQ就需要掌握软件和硬件开发的调试技巧,这样才能同时分析软件或者硬件的运行情况,找到问题,最终解决.那么本章将通过一个简单的例子带大家使用v ...
- python 定时爬取内容并发送报告到指定邮箱
import requests import smtplib import schedule import time from bs4 import BeautifulSoup from email. ...
- vue中$router 与 $route区别
vue-router中经常会操作的两个对象\(route和\)router两个. 1.$route对象 $route对象表示当前的路由信息,包含了当前 URL 解析得到的信息.包含当前的路径,参数,q ...