P5661 公交换乘
P5662 纪念品
P5663 加工零件
//某一个点,不止有一个最段路,所以需要分奇偶性。 //如果询问的是偶数阶段y,该点偶数性质的最段路<=y,则可以 //如果询问的是奇数阶段y,。。。 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<queue> using namespace std; int n,m,Q,hd[100005],dis[100005][3],cnt,x,y,vis[100005][3]; struct Edge{ int to,nxt; } edge[200005]; void add(int u,int v){ cnt++; edge[cnt].to = v; edge[cnt].nxt = hd[u]; hd[u] = cnt; } struct Node{ int id,dis; Node(){} Node(int x,int y):id(x),dis(y){} bool operator <(const Node& p) const{ return dis > p.dis; } }; priority_queue<Node> q; void dij(){ memset(dis, 0x3f, sizeof dis); dis[1][0] = 0; q.push(Node(1,0)); while(!q.empty()){// Node tmp = q.top(); q.pop(); int u = tmp.id; if(tmp.dis % 2 == 1){ if(!vis[u][1]) vis[u][1] = 1; }else{ if(!vis[u][0]) vis[u][1] = 1; } for(int i = hd[u]; i; i = edge[i].nxt){ int v = edge[i].to; if(dis[u][1] + 1 < dis[v][0]){ dis[v][0] = dis[u][1] + 1; q.push(Node(v,dis[v][0])); } if(dis[u][0] + 1 < dis[v][1]){ dis[v][1] = dis[u][0] + 1; q.push(Node(v,dis[v][1]));//用来排序 } } } } int main(){ scanf("%d%d%d",&n,&m,&Q); for(int i = 1; i <= m; i++){ scanf("%d%d",&x,&y); add(x,y), add(y,x); } dij(); for(int i = 1; i <= Q; i++){ scanf("%d%d",&x,&y); if(y % 2 == 0 && dis[x][0] <= y) printf("Yes\n"); else if(y % 2 == 1 && dis[x][1] <= y) printf("Yes\n"); else printf("No\n"); } return 0; } /* vis[1][0] = 1 , vis[1][1] vis[2][1] = 1, vis[3][0] = 1; 1,0 2,1 1,2 3,2 */ //大于最短距离 /* 5 5 5 1 2 2 3 3 4 4 5 1 5 1 5 */