1 条题解
-
0
C++ :
#include <cstdio> #include <cstring> #define maxn 10005LL #define maxe 200005LL #define infi 0x3f3f3f3fLL #define sizeque 20000LL struct FST{ int to , next ; } e[maxe] , re[maxe] ; int tot = 0 , star[maxn] = {0} ; void AddEdge(int u , int v) { tot ++ ; e[tot].to = v ; e[tot].next = star[u] ; star[u] = tot ; } int rtot = 0 , rstar[maxn] = {0} ; void AddrEdge(int u , int v) { rtot ++ ; re[rtot].to = v ; re[rtot].next = rstar[u] ; rstar[u] = rtot ; } int n , m ; int St , En ; int dis[maxn] = {0} ; bool exist[maxn] = {0} ; bool flag[maxn] = {0} ; struct Que{ int q[maxn] , head , tail ; int F(int x) { return ((x%sizeque)+sizeque)%sizeque ; } int front() { return q[F(head)] ; } bool empty() { return head > tail ; } void clear() { head = 0 ; tail = -1 ; } void pop() { head ++ ; } void push_front(int x) { q[F(--head)] = x ; } void push_back(int x) { q[F(++tail)] = x ; } } q ; void rspfa() { memset(dis , 0x3f , sizeof (dis)) ; dis[En] = 0 ; q.clear() ; q.push_back(En) ; int u , v , p ; while (!q.empty()) { u = q.front() ; q.pop() ; exist[u] = false ; for (p=rstar[u],v=re[p].to;p;p=re[p].next,v=re[p].to) { if (dis[v] > dis[u]+1) { dis[v] = dis[u]+1 ; if (!exist[v]) { exist[v] = true ; if (dis[v] < dis[q.front()]) q.push_front(v) ; else q.push_back(v) ; } } } } for (u = 1 ; u <= n ; u ++ ) if (dis[u] == infi) { flag[u] = true ; for (p=rstar[u],v=re[p].to;p;p=re[p].next,v=re[p].to) flag[v] = true ; } } void spfa() { if (flag[St]) { puts("-1") ; return ; } memset(dis , 0x3f , sizeof (dis)) ; dis[St] = 0 ; q.clear() ; q.push_back(St) ; int u , v , p ; while (!q.empty()) { u = q.front() ; q.pop() ; exist[u] = false ; for (p=star[u],v=e[p].to;p;p=e[p].next,v=e[p].to) { if (flag[v]) continue ; if (dis[v] > dis[u]+1) { dis[v] = dis[u]+1 ; if (!exist[v]) { exist[v] = true ; if (dis[v] < dis[q.front()]) q.push_front(v) ; else q.push_back(v) ; } } } } if (dis[En] == infi) puts("-1") ; else printf("%d\n" , dis[En] ) ; } int main() { // freopen("road.in" ,"r",stdin ) ; // freopen("road.out","w",stdout) ; int i , u , v ; scanf("%d%d", &n , &m ) ; for (i = 0 ; i < m ; i ++ ) { scanf("%d%d", &u , &v ) ; AddEdge(u , v) ; AddrEdge(v , u) ; } scanf("%d%d", &St , &En ) ; rspfa() ; spfa() ; fclose(stdin ) ; fclose(stdout) ; return 0 ; }
- 1
信息
- ID
- 2783
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者