uva-208-枚举-并查集
题意:
给你一个图,从1到指点的点有多少种不同的路径,用了并查集剪枝,如果当前节点的根不是指定的节点,直接返回,会超时
time limit了俩次,wa了俩次,PE俩次
#include <iostream>
#include <stdio.h>
#include<memory.h>
using namespace std; #define null NULL
const int N = 25;
int final = -1;
int mindex[N];
int map[N][N];
int vis[N];
int res[N];
int n, m;
int total = 0; int set[N];
int p(int s)
{
return set[s] == s ? s : set[s] = p(set[s]);
}
void add(int s, int e)
{
int p1 = p(s);
int p2 = p(e);
int t = s == final ? s : e;
if (t != final)
t = p1 == final ? p1 : p2;
if (t == final)
{
set[t] = final;
set[p1] = final;
set[p2] = final;
set[s] = final;
set[e] = final;
return;
}
if (p1 < p2)
{
set[p2] = p1;
}
else
{
set[p1] = p2;
}
} void read()
{
for (int i = 0; i < N; i++)
set[i] = i; int s, e;
while (cin >> s >> e)
{
if (s == 0 && e == 0)
return;
map[s][mindex[s]++] = e;
map[e][mindex[e]++] = s;
add(s, e);
}
} void sort(int l, int t, int a[])
{
for (int i = 0; i < t; i++)
{
for (int j = 1; j < t - i; j++)
{
if (a[j - 1] > a[j])
{
int t = a[j - 1];
a[j - 1] = a[j];
a[j] = t;
}
}
}
} void dfs(int cur, int rl)
{
if (cur == final)
{
printf("%d",res[0]);
for (int i = 1; i <= rl; i++)
{
printf(" %d", res[i]);
}
cout << endl;
++total;
return;
}
if (p(cur) != final)
return;
for (int i = 0; i < mindex[cur]; i++)
{
if (vis[map[cur][i]] == 0)
{
vis[map[cur][i]] = 1;
res[rl + 1] = map[cur][i];
dfs(map[cur][i], rl + 1);
vis[map[cur][i]] = 0;
}
}
} int main(int argc, char* argv[])
{
freopen("C:\\Users\\zzzzz\\Desktop\\1.txt", "r", stdin);
int t = 1;
string str =
"There are %d routes from the firestation to streetcorner %d.";
while (cin >> final)
{
memset(map, 0, sizeof(map));
memset(mindex, 0, sizeof(mindex));
memset(vis, 0, sizeof(vis));
read();
total = 0;
cout << "CASE " << t << ":" << endl;
for (int i = 1; i <= final; i++)
sort(i, mindex[i], map[i]);
vis[1] = 1;
res[0] = 1;
dfs(1, 0);
printf(str.c_str(), total, final);
cout<<endl;
++t;
} return 0;
}
uva-208-枚举-并查集的更多相关文章
- POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)
题意 在一个有N(1 ≤ N ≤ 1,000)个点环形图上有P(1 ≤ P ≤ 10,000)对点需要连接.连接只能连接环上相邻的点.问至少需要连接几条边. 思路 突破点在于最后的结果一定不是一个环! ...
- BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)
[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...
- bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】
枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...
- bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】
m是5000,就想到了直接枚举比例 具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案 #inc ...
- nyoj 711 枚举+并查集
#include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...
- 紫书 习题 11-12 UVa 1665 (并查集维护联通分量)
这道题要逆向思维 反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较 好操作, 如果正着做就要一点一点删除数字, 不好做. 我们需要在这个过程中维护联通块的个数, 这里用到了并查集. 首先 ...
- UVA - 12232 Exclusive-OR (并查集扩展偏离向量)
Description You are not given n non-negative integersX0,X1,..., Xn-1 less than220, but they do exist ...
- 紫书 习题11-11 UVa 1644 (并查集)
这道题感觉思路非常巧妙, 我是看了别人的博客才想明白的. 这里用到了并查集, 以根节点为中心城市, 然后把边从大到小排序, 每次的当前的边即为容量, 因为是目前的最小值, 然后去算总的容量, 每次选容 ...
- SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何
<传送门> 128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N poi ...
- HDU 1598 find the most comfortable road(枚举+并查集,类似于最小生成树)
一开始想到用BFS,写了之后,发现有点不太行.网上查了一下别人的解法. 首先将边从小到大排序,然后从最小边开始枚举,每次取比它大的边,直到start.end属于同一个集合,即可以连通时停止.过程类似于 ...
随机推荐
- Lua基本语法-lua与C#的交互(相当简单详细的例子)
lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...
- HDU 1814 模板题 2-sat
敲模板做的,不知道怎么就对了,注意一下建边即可··· 贴代码: #include<cstdio> #include<vector> using namespace std; # ...
- windows dos命令
dos命令配置环境变量: path=%path%;D:\Installed software\Professional software\Python27 (https://www.cnblogs ...
- ajax完整请求
@RequestMapping(value = "/quotaPage") // , method = RequestMethod.GET名额分配@ResponseBody //注 ...
- LM算法的推导过程
- LeetCode Single Number I II Python
Single Number Given an array of integers, every element appears twice except for one. Find that sing ...
- FastAdmin 开发第三天:安装 FastAdmin
环境安装安装好后就可以安装 FastAdmin 了. 根据文档说明安装步骤如下,推荐使用命令行安装: 克隆FastAdmin到你本地 git clone https://git.oschina.net ...
- vue-cli 知识点
vue init webpack [project_name] 构建的项目,新增功能需要做的工作: table th:first-of-type { width: 100px; } table th: ...
- yii 获取当前模块名、控制器名 、动作名
yii1 1. 获取控制器名 在控制器中获取控制器名: $name = $this->getId(); 在视图中获取控制器名: $name = Yii::app()->controller ...
- C语言sscanf用法解析与正则表达式支持
最近学习算法和输入输出用到的基本知识,首先是我自己写的一份代码参考和学习了很多资源 后面会给出参考资料,他们写得更加详细,正则表达式的支持确实是一大亮点所在 #include<iostream& ...