大致题意:

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代码的更多相关文章

  1. 2018省赛赛第一次训练题解和ac代码

    第一次就去拉了点思维很神奇的CF题目 2018省赛赛第一次训练 # Origin Title     A CodeForces 607A Chain Reaction     B CodeForces ...

  2. 2018天梯赛第一次训练题解和ac代码

    随着评讲的进行代码和题解会逐步放上来 2018天梯赛第一次训练 1001 : 进制转换 Time Limit(Common/Java):1000MS/10000MS     Memory Limit: ...

  3. 第八届河南省赛D.引水工程(kruthcra+prime)

    D.引水工程 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 118  Solved: 41 [Submit][Status][Web Board] D ...

  4. 第七届河南省赛G.Code the Tree(拓扑排序+模拟)

    G.Code the Tree Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 18 [Submit][Status][Web ...

  5. POJ-2421Constructing Roads,又是最小生成树,和第八届河南省赛的引水工程惊人的相似,并查集与最小生成树的灵活与能用,水过~~~

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K               Description There are N v ...

  6. 第七届河南省赛10403: D.山区修路(dp)

    10403: D.山区修路 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 69  Solved: 23 [Submit][Status][Web Bo ...

  7. 第八届河南省赛F.Distribution(水题)

    10411: F.Distribution Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 11  Solved: 8 [Submit][Status] ...

  8. 第七届河南省赛10402: C.机器人(扩展欧几里德)

    10402: C.机器人 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 53  Solved: 19 [Submit][Status][Web Boa ...

  9. 第八届河南省赛G.Interference Signal(dp)

    G.Interference Signal Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 17 [Submit][Status ...

随机推荐

  1. 常用的linux命令选项

    -a 显示所有对象 -c 生成一个计数 -d 制定一个目录 -e 扩展一个对象 -f 指定读入数据的文件 -h 显示命令的帮助信息 -i 忽略文本大小写 -l 产生输出的成格式版本 -n 使用非交互模 ...

  2. skywalking 的安装部署及其远程应用

    环境配置 centos 7.6 jdk 1.8 elasticsearch5.6.8 skyWalking3.2.6 1.安装elasticsearch wget https://artifacts. ...

  3. 51nod1050 循环数组最大子段和

    思路: 分两种情况讨论. 实现: #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll sum[ ...

  4. 【VS开发】MP4与H.264

    一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...

  5. matlab.坑01

    1.数据的行列 位置 1.1.c++中二维数组与二维mwarray数据格式之间的相互转换 - weixin_38723958的博客 - CSDN博客.html(https://blog.csdn.ne ...

  6. Eclipse配置编写HTML/JS/CSS/JSP页面的自动提示

    我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...

  7. 33.TCP协议概念/scapy模块doos攻击

    TCP协议概念/scapy模块: 1,TCP/IP四层协议: 2,TCP数据包的构成: TCP FLAGS:TCP数据包标志位 U:URG,紧急比特 A:ACK,确认比特 P:PSH,推送比特 S:S ...

  8. [转帖]linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具

    linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关 ...

  9. windows 修改Administrator管理员账户名

      用[Win+R]组合键命令打开[运行]界面,输入[gpedit.msc],按[回车键]或[鼠标左键]单击[确定]按钮:   在弹出的[本地组策略编辑器]对话框中,依次[鼠标左键]点击打开:[计算机 ...

  10. redis主从同步错误处理

    背景: 之前resis只有一台服务器(redis  master),现需要为其增加一台slave服务器(slave),做成一主一从 要求,不影响 master的正常情况下完成 . 1.配置slave: ...