题目链接:https://cn.vjudge.net/problem/Aizu-ALDS1_11_D
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <stack> #include <vector> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=1e5+10; int t,n,m,x,v,a1,a2,g=1; vector<int> V[maxn]; int color[maxn]; void dfs(int u){//递归写法 color[u]=g; for(int i=0;i<V[u].size();i++){ if(!color[V[u][i]]) dfs(V[u][i]); } } void dfs_(int u){//非递归写法 color[u]=g; stack<int> s; s.push(u); while(!s.empty()){ int now=s.top();s.pop(); for(int i=0;i<V[now].size();i++){ int vv=V[now][i]; if(!color[vv]){ color[vv]=g; s.push(vv); } } } } int main() { cin>>n>>m; for(int i=0;i<m;i++){ cin>>x>>v; V[x].push_back(v);//由于是无向图,所以你懂 V[v].push_back(x); } /*for(int i=1;i<=n;i++){ cout<<i<<" "; for(int j=0;j<V[i].size();j++){ cout<<V[i][j]<<" "; } cout<<endl; }*/ for(int i=0;i<n;i++){ if(!color[i]){ //dfs(i); dfs_(i); g++; } } cin>>t; for(int i=1;i<=t;i++){ cin>>a1>>a2; if(color[a1]==color[a2])printf("yes\n"); else printf("no\n"); } return 0; }