zoukankan      html  css  js  c++  java
  • 巡逻

    【题目描述】 

    jzyz的保卫科每天晚上都要进行巡逻,而一号实验楼是机房所在地,是要必须巡逻的。
    为了更好的描述问题,现在我们把jzyz抽象成一个图,这个图有N个点,M条有向边,保卫科在1号点,一号实验楼在2号点。每天巡逻必须从1号点出发,到达2号点再回到1号点,当然这个路径是包含自己选择的。
    因为今天只有1个保安,没有其他人监督,并且在晚上一个人巡逻是很痛苦的事情,现在他想要在巡逻的过程中,经过的不同的点的个数最小,如果能完成这个任务,你的rp可以增加!

    【题解】

    老师说这题是爆搜,然而写完后超时。。。据说正解是floyd

    加了个A*,跑的飞快,完爆正解。。。。。。

    R71954 Accepted
    From 宋逸群2018
     P1832.cpp
    100 / 19 ms
    2016-10-10 21:45:39
    #1
    R71953 Accepted
    From 焦景辉2018
     P1832.cpp
    100 / 2500 ms
    2016-10-10 21:45:11
    #1
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<ctime>
     7 #include<algorithm>
     8 using namespace std;
     9 #define INF 1000000000
    10 struct node{int y,next;}e[205];
    11 int n,m,len,top,ans(INF),Link[110],vis1[110],vis2[110],t[110],stack[110000];
    12 inline int read()
    13 {
    14     int x=0,f=1;  char ch=getchar();
    15     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
    16     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
    17     return x*f;
    18 }
    19 void insert(int x,int y)  {e[++len].next=Link[x];Link[x]=len;e[len].y=y;}
    20 void check()
    21 {
    22     int d=0;
    23     memset(t,0,sizeof(t));
    24     for(int i=1;i<=top;i++)
    25         if(!t[stack[i]])  {d++;  t[stack[i]]=1;}
    26     if(d<ans)  ans=d;
    27 }
    28 bool get()
    29 {
    30     int d=0;
    31     memset(t,0,sizeof(t));
    32     for(int i=1;i<=top;i++)
    33         if(!t[stack[i]])  {d++;  t[stack[i]]=1;  if(d>=ans)  return 0;}
    34     return 1;
    35 }
    36 void dfs2(int x)
    37 {
    38     if(!get())  return;
    39     if(x==1)  {check();  return;}
    40     for(int i=Link[x];i;i=e[i].next)
    41         if(!vis2[e[i].y])
    42         {
    43             stack[++top]=e[i].y;  vis2[e[i].y]=1;
    44             dfs2(e[i].y);
    45             top--;  vis2[e[i].y]=0;
    46         }
    47 }
    48 void dfs1(int x)
    49 {
    50     if(!get())  return;
    51     if(x==2)  {dfs2(2);vis2[2]=1; return;}
    52     for(int i=Link[x];i;i=e[i].next)
    53         if(!vis1[e[i].y])
    54         {
    55             stack[++top]=e[i].y;  vis1[e[i].y]=1;
    56             dfs1(e[i].y);
    57             top--;  vis1[e[i].y]=0;
    58         }
    59 }
    60 int main()
    61 {
    62     //freopen("cin.in","r",stdin);
    63     //freopen("cout.out","w",stdout);
    64     n=read();  m=read();
    65     for(int i=1;i<=m;i++)
    66     {
    67         int x=read(),y=read();
    68         insert(x,y);
    69     }
    70     stack[++top]=1;
    71     vis1[1]=1;
    72     dfs1(1);
    73     printf("%d
    ",ans);
    74     return 0;
    75 }
  • 相关阅读:
    商务通代码
    Ubuntu 创建快捷方式的方法
    Linux安装Nginx
    Linux安装jdk10
    Mycat实现Mysql数据库读写分离
    Mysql主从复制
    SpringBoot整合Redis集群
    Redis集群环境搭建
    SpringBoot整合redis哨兵主从服务
    redis 哨兵机制环境搭建
  • 原文地址:https://www.cnblogs.com/chty/p/5947359.html
Copyright © 2011-2022 走看看