关于样例没过题却过了这件事
查看原帖
关于样例没过题却过了这件事
290406
MaoMaoNB楼主2021/9/3 15:06

是这样的

本蒟蒻正在复习最短路

然后打了这题结果样例一没过

改了大半天没发现那里不对想着交一发

然后一发过了。。

记录

#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,m,c,cnt=0;
int head[N<<1],nxt[N<<1],to[N<<1];
int dis[N][2],vis[N][2]={};
struct node{
	int d,num;
	bool operator <(const node &x)const
	{
		return x.d<d;
	}
};
void add(int u,int v){
	to[++cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
priority_queue<node>q;
void dijkstra(){
	for(int i=1;i<=m;i++)dis[i][0]=1e9,dis[i][1]=1e9;
	dis[1][0]=0;
	q.push((node){0,1});
	while(!q.empty()){
		node tmp=q.top();q.pop();
		int x=tmp.num;
		for(int i=head[x];i;i=nxt[i]){
			int y=to[i];
			if(dis[y][0]>dis[x][1]+1){
				dis[y][0]=dis[x][1]+1;
				if(!vis[y][0]){
					vis[y][0]=1;
					q.push((node){dis[y][0],y});
				}
			}
			if(dis[y][1]>dis[x][0]+1){
				dis[y][1]=dis[x][0]+1;
				if(!vis[y][1]){
					vis[y][1]=1;
					q.push((node){dis[y][1],y});
				}
			}
		}
	}
}
int main(){
	cin>>n>>m>>c;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dijkstra();
	for(int i=1;i<=c;i++){
		int x,y;
		cin>>x>>y;
		if(!head[1]){
			cout<<"No"<<endl;
			continue;
		}
		else if(dis[x][y%2]<=y)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}

以上代码应简单易懂 救一救啊qwq

2021/9/3 15:06
加载中...