1 条题解

  • 0
    @ 2025-9-10 0:08:22

    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
    上传者