1 条题解

  • 0
    @ 2025-8-22 21:40:13

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    using namespace std;
    const int N=100005,M=200005;
    int edge[M],head[N],Next[M],ver[M],d[N];
    bool v[N];
    int t,n,m,tot;
    int ou[N],ji[N];//汉语拼音QAQ
    queue<int> q;
    void add(int x,int y){
    	ver[++tot]=y;
    	edge[tot]=1;
    	Next[tot]=head[x];
    	head[x]=tot;
    }//存图
    void SPFA(){
        for(int i=0;i<=N-4;i++){
        	ou[i]=10000000;
    	}//为了便于判断有没有奇最短路或偶最短路,我存了10000000
        for(int i=0;i<=N-4;i++){
        	ji[i]=10000000;
    	}
        memset(v,0,sizeof(v));
    	ou[1]=0;
    	v[1]=1;
        q.push(1);
        while(!q.empty()){
        	int x=q.front();
        	q.pop();
        	v[x]=0;
        	for(int i=head[x];i;i=Next[i]){
        		int y=ver[i],z=1;
        		if(ou[x]+z<ji[y]){//因为边权都是1,所以偶数肯定是由奇数+1得来,奇数也同理
        			ji[y]=ou[x]+z;
        			if(!v[y]) q.push(y),v[y]=1;
    			}
    			if(ji[x]+z<ou[y]){
    				ou[y]=ji[x]+z;
    				if(!v[y]) q.push(y),v[y]=1;
    			}
    		}
    	}
    }//正常的SPFA
    int main()
    {
    	scanf("%d%d%d",&t,&n,&m);
    	for(int i=1,u,r;i<=n;i++){
    		scanf("%d%d",&u,&r);
    		add(u,r);
    		add(r,u);
    	}
    	SPFA();
    	int a,l;
    	while(m--){
    		scanf("%d%d",&a,&l);
    	    if(l%2==0){
    	    	if(ou[a]>l){
    	    		printf("No\n");
    			}//如果最短路距离过长,那么肯定不行
    			else{
    				if(ou[a]==10000000){
    					printf("No\n");//没有偶最短路
    				}
    				else{
    					printf("Yes\n");
    				}
    			}
    		}
    		else{
    			if(ji[a]>l){
    				printf("No\n");
    			}
    			else{
    				if(ji[a]==10000000){
    					printf("No\n");
    				}
    				else{
    					printf("Yes\n");
    				}
    			}
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    3818
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者