NOIp2014Day2T2 寻找道路

题目分析:

根据题目要求,有如下一些点不能计入路径:

第一:不能到达t的

第二:有边直接指向第一种点的

基于图是无向的,因此我们建立题目过给图G的反图G‘,G’上t不可达的点和这种点在G‘上直接指向的点不能计入路径。

随后在G上去掉这些点,做BFS。

代码细节:

也没什么细节。请参考代码部分。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 //variable//
 9 int last1[10010],prel1[200100],dest1[200100],vis1[10010],dep1[10010],tot1=1;
10 int last2[10010],prel2[200100],dest2[200100],vis2[10010],dep2[10010],tot2=1;
11 int s,t,n,m,q[100000];
12 
13 //solve//
14 int main(){
15     memset(vis1,0,sizeof vis1);
16     memset(vis2,0,sizeof vis2);
17     scanf("%d%d",&n,&m);
18     int u,v;
19     for (int i=0;i<m;++i){
20         scanf("%d%d",&u,&v);
21         dest1[++tot1]=v;prel1[tot1]=last1[u];last1[u]=tot1;
22         dest2[++tot2]=u;prel2[tot2]=last2[v];last2[v]=tot2;
23     }
24     scanf("%d%d",&s,&t);
25     memset(q,0,sizeof q);
26     int he=1,ta=1;
27     q[1]=t;vis2[t]=1;
28     while (he<=ta){
29         int u=q[he++];
30         for (int k=last2[u];k;k=prel2[k]){
31             if (!vis2[dest2[k]]){
32                 vis2[dest2[k]]=1;
33                 q[++ta]=dest2[k];
34             }
35         }
36     }
37     for (int i=1;i<=n;++i){
38         if (!vis2[i]){
39             vis1[i]=1;
40         }
41     }
42     for (int i=1;i<=n;++i){
43         if (!vis2[i]){
44             for (int k=last2[i];k;k=prel2[k]){
45                 vis1[dest2[k]]=1;
46             }
47         }
48     }
49     if (vis1[s]){
50         puts("-1");
51         return 0;
52     }
53     memset(q,0,sizeof q);
54     memset(dep1,0,sizeof dep1);
55     he=1,ta=1;
56     q[1]=s;vis1[s]=1;dep1[s]=0;
57     while (he<=ta){
58         int u=q[he++];
59         for (int k=last1[u];k;k=prel1[k]){
60             if (!vis1[dest1[k]]){
61                 vis1[dest1[k]]=1;
62                 q[++ta]=dest1[k];
63                 dep1[dest1[k]]=dep1[u]+1;
64                 if (dest1[k]==t){
65                     printf("%d\n",dep1[dest1[k]]);
66                     return 0;
67                 }
68             }
69         }
70     }
71 }
View Code

 

posted @ 2015-09-10 13:49  DeAR3327  阅读(161)  评论(0编辑  收藏  举报