【ZJOI2004】嗅探器

一道鬼畜的题目,洛谷给的标签是紫题,怎么可能是紫题……

原本我想找出在起点到终点的路径上的割点,但是看到了这良心的数据之后……

由于数据很小,所以我们枚举中间点,然后进行一遍dfs,判断不经过这个中间点这张图是否联通即可。

这就能过??

是的……时间复杂度为O(n2)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int n;
 7 struct node {
 8     int next,to;
 9 }a[100010];
10 int num,head[100010];
11 bool vis[1010];
12 int x,y;
13 inline void add(int from,int to) {
14     a[++num].next=head[from];
15     a[num].to=to;
16     head[from]=num;
17 }
18 bool dfs(int u,int pd) {
19     for(int i=head[u];i;i=a[i].next) {
20         int v=a[i].to;
21         if(vis[v]) continue ;
22         if(v==pd) continue ;
23         if(v==x) continue ;
24         if(v==y) return 1;
25         vis[v]=1;
26         if(dfs(v,pd)) return 1;
27     }
28     return 0;
29 }
30 int main() {
31     scanf("%d",&n);
32     while(scanf("%d%d",&x,&y)==2&&x&&y) {
33         add(x,y);
34         add(y,x);
35     }
36     scanf("%d%d",&x,&y);
37     for(int i=1;i<=n;i++) {
38         if(i==x||i==y) continue ;
39         memset(vis,0,sizeof(vis));
40         if(!dfs(x,i)) {
41             printf("%d\n",i);
42             return 0;
43         }
44     }
45     puts("No solution");
46     return 0;
47 }
AC Code

 

posted @ 2019-05-04 10:39  AD_shl  阅读(228)  评论(0编辑  收藏  举报