题目:

给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径。

思路:

1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是就想到了用并查集来预先判断是否属于同一个连通分量。

2.可以将与d属于同一个连通分量的点用一个数组保存起来,然后dfs搜索这个数组就可以了,这也就是只搜索了与d在一个连通分量里的点。

3.当搜索到d的时候就输出路径。

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e3
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
bool mp[maxn][maxn];
int fa[maxn],d,lk[maxn],vis[maxn];
int idx,path[maxn],cnt; void init(){
for(int i=; i<maxn; i++){
fa[i] = i;
}
memset(lk,,sizeof(lk));
memset(vis,,sizeof(vis));
memset(mp,,sizeof(mp));
memset(path,,sizeof(path));
} int _find(int x){//并查集查找祖先
return fa[x]==x ? x : fa[x] = _find(fa[x]);
} void mergeNode(int x,int y){//合并不属于同一个连通分量的两个点
int tx = _find(x),ty = _find(y);
if(tx != ty){
fa[tx] = ty;
}
} bool isLinked(int x,int y){//判断两个点是不是属于同一个连通分量
if(_find(x)!=_find(y)){
return false;
}
return true;
} void DFS(int now, int MX){
if(now==d){//搜索到d就输出;路径
cnt++;
printf("");
for(int i=; i<MX; i++){
printf(" %d",path[i]);
}
printf("\n");
}else{
//cout<<now<<endl;
for(int i=; i<idx; i++){
int u = lk[i];
if(!vis[u] && mp[now][u]){
vis[u] = true;
path[MX] = u;//这里其实没必要另开一个数组保存路径,在下一个循环的时候当前的路径已经输出或没用了
DFS(u,MX+);
vis[u] = false;
}
}
}
} void check(){
for(int i=; i<idx; i++){
printf("%d ",lk[i]);
}
printf("\n");
} int main(){
//FRE();
int kase=;
while(scanf("%d",&d)!=EOF){
int st,en;
init();
while(scanf("%d%d",&st,&en)&&st){
mp[st][en] = ;
mp[en][st] = ;
mergeNode(st,en);
}
printf("CASE %d:\n",++kase);
if(isLinked(,d)==false){
printf("There are 0 routes from the firestation to streetcorner %d.\n",d);
}else{
idx=;
for(int i=; i<maxn; i++){//找到与d在同一个连通分量里边的点并保存
if(isLinked(i, d)){
lk[idx++] = i;
}
}
sort(lk,lk+idx);//从小到大排序,保证字典序
//check();
cnt = ;
DFS(, );
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,d);
}
}
return ;
}

最新文章

  1. POCO库——Foundation组件之核心Core
  2. 【原】iOS学习之苹果原生代码实现Autolayout和VFL语言
  3. 修改AspNetPager的CustomInfoHTML,添加自定义样式
  4. out与ref的区别
  5. jquery获取和设置元素高度宽度
  6. GET /hello/fred/0926xxx572
  7. Oracle 显示时间问题
  8. 32. Longest Valid Parentheses
  9. 与众不同 windows phone (2) - Control(控件)
  10. pur-ftpd在ubuntu上的安装2(数据库管理)
  11. HMC5883L地磁传感器驱动
  12. 笔记:I/O流-对象序列化
  13. 【Go】优雅的读取http请求或响应的数据
  14. 从零开始学安全(九)●OSI参考模型分层
  15. elasticSearch聚合sum查询
  16. tomcat启动慢解决方案
  17. [CodeForces - 614E] E - Necklace
  18. POJ2480 Longge&#39;s problem
  19. 紧接着上篇文章,实现类一个是标准的FIFO,一个是出队在头部入队不一定追加到末尾
  20. linux下的进程信息管理

热门文章

  1. dpdpdpdp~~~!!!
  2. POJ2187 Beauty Contest (旋转卡壳算法 求直径)
  3. POJ1584 A Round Peg in a Ground Hole 凸包判断 圆和凸包的关系
  4. [置顶][终极精简版][图解]Nginx搭建flv mp4流媒体服务器
  5. hive 内部表与外部表的区别
  6. Luogu P5027 【Barracuda】(高斯消元)
  7. Spring.Net学习笔记(4)-属性及构造器注入
  8. Java 创建Excel并逐行写入数据
  9. [ CodeForces 515 D ] Drazil and Tiles
  10. CF798C Mike and gcd problem