中文题
问任意两点是否能到达
问的就是 这个图是否为强连通分量
1A
#include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; #define MAXN 10010 int low[MAXN],dfn[MAXN],stack[MAXN],sum[0],top,times,m,n; bool instack[MAXN]; vector <int> e[MAXN]; void tarjan(int u){ dfn[u]=low[u]=++times; stack[top++]=u; instack[u]=true; for(int i=0;i<(int)e[u].size();i++){ int v=e[u][i]; if(!dfn[v]){ tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) low[u]=min(low[u],low[v]); } if(dfn[u]==low[u]){ ++sum[0]; do{ u=stack[--top]; instack[u]=false; }while(dfn[u]!=low[u]); } } void init(){ for(int i=0;i<MAXN;i++)e[i].clear(); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(instack,0,sizeof(instack)); sum[0]=top=times=0; } int main(){ while(~scanf("%d%d",&n,&m)&&(n||m)){ init(); for(int i=0,x,y;i<m;i++){ scanf("%d%d",&x,&y); e[x].push_back(y); } for(int i=1;i<=n;i++) if(!dfn[i])tarjan(i); puts(sum[0]==1?"Yes":"No"); } }
|