记录编号 |
329943 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2014]寻找道路 |
最终得分 |
100 |
用户昵称 |
coolkid |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.172 s |
提交时间 |
2016-10-25 20:14:29 |
内存使用 |
4.61 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=10010;
const int MAXM=200010;
struct Edge{
int to,dist,nxt;
}edges[MAXM<<1];
int head[MAXN][2],cnt=0;
void addedge(int f,int t,int d,int k){
edges[cnt].to=t;
edges[cnt].dist=d;
edges[cnt].nxt=head[f][k];
head[f][k]=cnt++;
}
int n,m;
int S,T;
int vis[MAXN];
void init(){
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int f,t;
scanf("%d%d",&f,&t);
addedge(f,t,1,0);
addedge(t,f,1,1);
}
scanf("%d%d",&S,&T);
}
queue<int> q;
int VIS[MAXN];
void BFS(){
memset(vis,0,sizeof(vis));
memset(VIS,0,sizeof(VIS));
q.push(T);
vis[T]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u][1];~i;i=edges[i].nxt){
int v=edges[i].to;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
//BFS找vis
for(int i=1;i<=n;i++)if(vis[i]==0)
for(int j=head[i][1];~j;j=edges[j].nxt) VIS[edges[j].to]=1;
}
const int INF=2147483647;
int d[MAXN];
int inq[MAXN];
//int pre[MAXN];
void SPFA(int S,int T){
memset(inq,false,sizeof(inq));
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++) d[i]=INF;
d[S]=0;
inq[S]=1;
q.push(S);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=0;
for(int i=head[u][0];~i;i=edges[i].nxt){
int v=edges[i].to;
// printf("u:%d v:%d\n",u,v);
if(VIS[v]) continue;
if(d[v]>d[u]+1){
d[v]=d[u]+1;
// pre[v]=u;
if(!inq[v]){
q.push(v);
inq[v]=1;
}
}
}
}
/*
int x=T;
printf("Route:\n");
while(x!=S){
printf("%d\n",x);
x=pre[x];
}
*/
// for(int i=1;i<=n;i++) printf("%d ",vis[i]);
// puts("");
if(d[T]==INF){
printf("-1\n");
} else printf("%d\n",d[T]);
}
void work(){
BFS();
SPFA(S,T);
}
int main(){
freopen("roadb.in","r",stdin);
freopen("roadb.out","w",stdout);
init();
work();
return 0;
}
/*
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5
*/