十一届河南省赛-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 ...
随机推荐
- ahk实现git图床自动预览以及转换markdown格式
ahk实现git图床自动预览以及转换markdown格式 软件地址 https://gitee.com/layty/pic/tree/master/app 软件功能: 检测剪切板,如果剪切板有非文本信 ...
- JavaSE基础(四)--Java基本数据类型
Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不 ...
- javascript学习笔记 BOM和DOM详解
js组成 我们都知道, javascript 有三部分构成,ECMAScript,DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其他的浏览器风格迥异. 1. DOM 是 W ...
- centos7.4安装图形界面及报错处理
笔者实验环境:centos 7.4.1708,安装时默认最小化安装. 安装命令: yum -y update #如果不想升级内核版本可以参考笔者另一篇文章,关于update跟upgrade的区别yum ...
- Scala当中什么是RDD(Resilient Distributed Datasets)弹性分布式数据集
RDD(Resilient Distributed Datasets)弹性分布式数据集.你不好理解的话,可以把RDD就可以看成是一个简单的"动态数组"(比如ArrayList),对 ...
- python学习-3 python基础-1基础知识和解释器
1.基础知识 ~后缀名是可以是任意的 ~导入模块时,如果不是.py就会报错 =>>所以尽量后缀名携程.py 2.执行方式 -python解释器 3. #!/usr/bin/env py ...
- 如何设置输入IP地址就直接访问到某一个网站
如何设置输入IP地址就直接访问到某一个网站 1).在IIS中添加好站点后,在网站绑定中设置明确的IP地址,如下图: 2).修改Default WebSite的端口,或者是把Default WebSit ...
- Delphi编译器属性(特别修饰符Ref,Unsafe,Volatile,Weak)
1 Refdelphi中常量参数就像一个本地常量,或者说只读变量.常量参数与值参数类似,除了不能在过程或函数体内给常量参数赋值,并且不能将常量参数传给另一个var类型参数.(但是,如果你常量参数传递的 ...
- MACD中短线交易系统
1.MA5.MA10金叉,且股价收盘站稳5日均线 2.MACD金叉 3.MACD红绿柱 a.MACD红柱发散,表示多头力量增强,此时买入或加仓 b.MACD红柱收缩,表示多头力量减弱,此时卖出或减仓 ...
- linux脚本监控应用且通过邮件报警异常
一.背景 最近接到监控应用并通过邮件报警的任务,由于需求比较简单,故没有使用springboot那套,而是采用linux脚本的方式进行监控. 二.思路 通过linux自带的定时功能,定时执行一个lin ...