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属于同一个集合,即可以连通时停止.过程类似于 ...
随机推荐
- 游标 cursor
* mongo shell下支持JS代码,可以通过JS获取游标,进而获取数据操作结果. var cursor = db.class1.find() cursor.next() 获取下一条结果 curs ...
- Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法
问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository ...
- CodeForces - 1098.DIV1.C: Construct a tree(贪心,构造)
Misha walked through the snowy forest and he was so fascinated by the trees to decide to draw his ow ...
- OASGraph 转换rest api graphql 试用
创建rest api lb4 appdemo 参考提示即可 安装 OASGraph git clone https://github.com/strongloop/oasgraph.git cd oa ...
- 哈勃(Hubble)望远镜的新发现
请看下图: itok=FcRLe7t_" name="图形1" alt="" border="0" height ...
- C#:消息队列应用程序
Carl NolanMicrosoft Corporation 摘要:本文概述一种用于处理若干消息队列的 Windows 服务解决方案,重点介绍 .NET 框架和 C# 应用程序. 下载 CSharp ...
- C语言利用SMTP协议发送邮件
#ifdef WIN32 #include <windows.h> #include <stdio.h> #else #include <stdio.h> #inc ...
- PHP 的工作流组件记录
我目前只知道在有审批流程中会用到工作流. 不过我我还没用过,还不知道怎么使用. 暂且先记录一下,目前我找到的几个 PHP 工作流组件. symfony https://github.com/symfo ...
- tomcat源码阅读之日志记录器(Logger)
UML图: 1.Logger接口中定义了日志的级别:FATAL.ERROR.WARNING.INFORMATION.DEBUG,通过接口函数getVerbosity获取日志级别,setVerbosit ...
- java 中一些需要注意的知识点
java数组的length属性是容量,而不是数组真实元素的个数: 多线程中的interrupt()方法并不会终止处于"运行状态"的线程,它只是将线程的中断标记设为true. juc ...