迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11070    Accepted Submission(s): 4948

Problem Description
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
 
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
 
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
 
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
 
Sample Output
Yes
No
有向图缩点模板题
模板1:kosaraju
#include"cstdio"
#include"cstring"
#include"vector"
using namespace std;
const int MAXN=;
vector<int> G[MAXN];
vector<int> rG[MAXN];
vector<int> vs;
int V,E;
int vis[MAXN];
inline int max(int a,int b)
{
return a > b? a: b;
}
void dfs(int u)
{
vis[u]=;
for(int i=;i<G[u].size();i++)
if(!vis[G[u][i]]) dfs(G[u][i]);
vs.push_back(u);
}
void rdfs(int u)
{
vis[u]=;
for(int i=;i<rG[u].size();i++)
if(!vis[rG[u][i]]) rdfs(rG[u][i]);
}
bool scc()
{
memset(vis,,sizeof(vis));
for(int i=;i<=V;i++)
if(!vis[i]) dfs(i);
memset(vis,,sizeof(vis));
int k=;
for(int i=vs.size()-;i>=;i--)
if(!vis[vs[i]])
{
rdfs(vs[i]);
k++;
if(k>) return false;
}
return true;
}
int main()
{
while(scanf("%d%d",&V,&E)!=EOF&&V)
{
vs.clear();
for(int i=;i<=V;i++)
{
G[i].clear();
rG[i].clear();
}
for(int i=;i<E;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
rG[v].push_back(u);
} if(scc())
{
printf("Yes\n");
}
else
{
printf("No\n");
}
} return ;
}

模板2:tarjan

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=;
vector<int> mp[MAXN];
int n,m;
int dfn[MAXN],low[MAXN],time;
int stack[MAXN],top;
bool ins[MAXN];
int cnt=;
void tarjan(int u)
{
dfn[u]=low[u]=++time;
stack[top++]=u;
ins[u]=true;
for(int i=;i<mp[u].size();i++)
{
int v=mp[u][i];
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
int v;
cnt++;
do{
v=stack[--top];
ins[v]=false;
}while(u!=v);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)
break;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(ins,false,sizeof(ins));
time=;
top=;
cnt=;
for(int i=;i<=n;i++)
mp[i].clear();
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
mp[u].push_back(v);
} for(int i=;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
} if(cnt==)
printf("Yes\n");
else
printf("No\n");
}
}

该题目也可用并查集做。

#include"cstdio"
#include"cstring"
using namespace std;
const int MAXN=;
int V,E;
int par[][MAXN];//par[0][MAXN]记录正向边,par[1][MAXN]记录反向边
int fnd(int x,int type)
{
if(par[type][x]==x)
{
return x;
}
return par[type][x]=fnd(par[type][x],type);
}
void unite(int x,int y)
{
if(x>) par[][x]=fnd(y,);//将结点1作为根结点
if(y>) par[][y]=fnd(x,);
}
bool judge()
{
for(int i=;i<=V;i++)
if(fnd(i,)!=||fnd(i,)!=) return false;//若所有结点(除1)沿正向边均能到达1结点且将边反向后也均能到达1结点,那么改图为强连通图
return true;
}
int main()
{
while(scanf("%d%d",&V,&E)!=EOF&&V)
{
for(int i=;i<=V;i++) par[][i]=par[][i]=i;
for(int i=;i<E;i++)
{
int u,v;
scanf("%d%d",&u,&v);
unite(u,v);
}
if(judge()) printf("Yes\n");
else printf("No\n");
} return ;
}
 

最新文章

  1. Ajax聊天
  2. Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数
  3. mingw fbx sdk /浮点数精度
  4. 通过布赛尔曲线以及CAShapeLayer的strokeStart 、strokeEnd 属性来实现一个圆形进度条
  5. 使用Sqlite数据库存储数据
  6. HDU 3366 Passage (概率DP)
  7. C#连接sqlserver数据库
  8. JNDI深入浅出
  9. 小白学Maven第一篇配置
  10. memcached安装报错 error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory解决
  11. MYSQL ERROR 1045 (28000) Access denied for user (using password YES)问题的解决
  12. [No0000175]maven常用命令集合(收藏大全)
  13. Failed to start docker.service: Unit not found.
  14. 复刻smartbits的国产网络测试工具minismb-如何测试路由器
  15. HDU—— 5159 Building Blocks
  16. Tomcat报错Exception: java.lang.OutOfMemoryError
  17. HTTP Response Code 中文详解
  18. web 批量打印
  19. spring boot JedisCluster连接redis集群配置
  20. 在向&quot;带有自增字段的数据库表&quot;中插入数据时,自定义&quot;该自增字段&quot;的数据

热门文章

  1. Spark源码分析之七:Task运行(一)
  2. 如何创建虚拟硬盘 + os 读取硬盘参数代码
  3. windows 10 python 2.7和python3.6共存解决方法和pip安装
  4. testVC.modalPresentationStyle = UIModalPresentationFormSheet; 更改 VC大小
  5. 利用.dSYM跟.app文件准确定位Crash位置
  6. 1355: [Baltic2009]Radio Transmission[循环节]
  7. 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包
  8. ES通过API调整设置
  9. 关于eclipse 插件的挂载
  10. OCR光学字符识别--STN-OCR 测试