巡逻

【题目描述】 

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\n",ans);
74     return 0;
75 }

 

posted @ 2016-10-10 21:27  chty  阅读(401)  评论(3编辑  收藏  举报