巡逻
【题目描述】
jzyz的保卫科每天晚上都要进行巡逻,而一号实验楼是机房所在地,是要必须巡逻的。
为了更好的描述问题,现在我们把jzyz抽象成一个图,这个图有N个点,M条有向边,保卫科在1号点,一号实验楼在2号点。每天巡逻必须从1号点出发,到达2号点再回到1号点,当然这个路径是包含自己选择的。
因为今天只有1个保安,没有其他人监督,并且在晚上一个人巡逻是很痛苦的事情,现在他想要在巡逻的过程中,经过的不同的点的个数最小,如果能完成这个任务,你的rp可以增加!
【题解】
老师说这题是爆搜,然而写完后超时。。。据说正解是floyd
加了个A*,跑的飞快,完爆正解。。。。。。
R71954 | Accepted |
|
100 / 19 ms
|
2016-10-10 21:45:39
|
#1 | |
R71953 | Accepted |
|
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 }