标签:ace app bsp name 星际 block 表示 one cpp
Yes
最大数据第一行:19999 17542 1664
思路:显而易见,只要询问的两个点属于一个强连通分量,就能到达,否则不能到达,tarjan水之。
喜闻乐见的Code
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 20004
#define maxm 17545
struct Edge {
int u,v,next;
Edge(int u=0,int v=0,int next=0):
u(u),v(v),next(next) {}
}edge[maxm<<1];
int head[maxn],cnt=0;
int dfn[maxn],low[maxn],timee=0;
int st[maxn],top,col[maxn],num=0;
bool ins[maxn],vis[maxn];
inline int input() {
char c=getchar();int x=0,flag=1;
for(;c<‘0‘||c>‘9‘;c=getchar())
if(c==‘-‘) flag=-1;
for(;c>=‘0‘&&c<=‘9‘;c=getchar())
x=(x<<1)+(x<<3)+c-‘0‘;
return x*flag;
}
inline void Add_edge(int u,int v) {
edge[++cnt]=Edge(u,v,head[u]);
head[u]=cnt;
return;
}
void dfs(int now) {
dfn[now]=low[now]=++timee;
st[++top]=now;
vis[now]=ins[now]=true;
for (int i=head[now];i;i=edge[i].next) {
int v=edge[i].v;
if(ins[v])
low[now]=min(low[now],dfn[v]);
else if(!vis[v]) {
dfs(v);
low[now]=min(low[now],low[v]);
}
}
if(low[now]==dfn[now]) {
col[now]=++num;
while (st[top]!=now) {
col[st[top]]=num;
ins[st[top--]]=false;
}
ins[now]=false;
top--;
}
return;
}
int main() {
int n=input(),m=input(),q=input();
for(int i=1;i<=m;i++) {
int u=input(),v=input();
Add_edge(u,v);
Add_edge(v,u);
}
for(int i=1;i<=n;i++)
if(!vis[i]) dfs(i);
while(q--) {
int x=input(),y=input();
if(col[x]!=col[y]) printf("No\n");
else printf("Yes\n");
}
return 0;
}
标签:ace app bsp name 星际 block 表示 one cpp
原文地址:http://www.cnblogs.com/NuclearSubmarines/p/6849913.html