题目分析:
根据题目要求,有如下一些点不能计入路径:
第一:不能到达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 }