博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA - 208 Firetruck 并查集+dfs
阅读量:3904 次
发布时间:2019-05-23

本文共 1705 字,大约阅读时间需要 5 分钟。

题目:

输入一个n(n<=20)个结点的无向图以及某个节点k,按照字典序从小到大排序输出从结点1到结点k的所有路径,要求结点不能重复经过。

注意:

要事先判断1到k是否连通。

思路:

判断连通可以通过并查集判断它们是否在同一个集合中。

然后就是dfs找路径了。

代码如下:

#include 
#include
#include
#include
#include
using namespace std;int t=0;int n;int a[25][25];int vis[25];int b[25];int num;int ans[25];int rot;int Find(int x){ if(x==b[x]) return x; return b[x]=Find(b[x]);}void dfs(int tnum,int x){ ans[tnum]=x; vis[x]=1; if(x==n) { rot++; for (int i=0;i<=tnum;i++) printf("%d%c",ans[i],i==tnum?'\n':' '); return; } for (int i=1;i<=20;i++) { if(a[x][i]&&!vis[i]) { dfs(tnum+1,i); vis[i]=0; } }}int main(){ while (scanf("%d",&n)!=EOF) { rot=0; t++; for (int i=1;i<25;i++) b[i]=i; memset (vis,0,sizeof(vis)); memset (a,0,sizeof(a)); num=0; int x,y; while (scanf("%d%d",&x,&y)) { if(x==0&&y==0) break; if(!vis[x]) { num++; vis[x]=1; } if(!vis[y]) { num++; vis[y]=1; } a[x][y]=1; a[y][x]=1; int px=Find(x); int py=Find(y); b[px]=py; } int p1=Find(1); int p2=Find(n); printf("CASE %d:\n",t); if(p1!=p2) { printf("There are 0 routes from the firestation to streetcorner %d.\n",n); continue; } memset(vis,0,sizeof(vis)); dfs(0,1); printf("There are %d routes from the firestation to streetcorner %d.\n",rot,n); } return 0;}

 

转载地址:http://twoen.baihongyu.com/

你可能感兴趣的文章
LabWindows/CVI线程操作
查看>>
labwindows计时器
查看>>
Java简易计算器
查看>>
在对象间“广播消息”
查看>>
研华采集卡参数说明
查看>>
常用传感器信号测量汇总
查看>>
学会NI-DAQmx10个函数,解决80%的数据采集应用问题
查看>>
对Navigation基础的了解
查看>>
视觉SLAM漫谈
查看>>
Simultaneous Localization and Mapping (SLAM)讲义1
查看>>
SLAM资源收集
查看>>
Matlab中的color 画线的多种颜色
查看>>
Matlab 中输入希腊字母
查看>>
拿ROS navigation 玩自主导航攻略(1)——by 西工大一小学生
查看>>
ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)
查看>>
ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
查看>>
基础网络概念(鸟哥的私房菜)
查看>>
Linux 常用网络命令介绍
查看>>
graph slam tutorial : 从推导到应用1
查看>>
graph slam tutorial :从推导到应用2
查看>>