UVa(247),Floyd做传递闭包
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=183

紫书365页,用Floyd做传递闭包,然后深搜,其实可以不用找前驱,没有一定的顺序,爆搜一边就可以了。
然后是名字的导入,用vector处理就很好了。没有找到,就加到后面。
freopen没有注释掉,WA得我想哭。
names没清空,RE得想死。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <vector> using namespace std; int dist[][];
bool vis[]; int n,m; vector<string> names; int getId(const string &s)
{
for(int i=; i<names.size(); i++)
if(names[i]==s) return i;
names.push_back(s);
return names.size()-;
} void dfs(int u)
{
vis[u] = ;
for(int v=; v<n; v++)
if(!vis[v]&&dist[u][v]&&dist[v][u])
{
printf(", %s", names[v].c_str());
dfs(v);
}
} int main()
{
char s1[], s2[];
int cases = ;
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m),n)
{
names.clear();
memset(dist,,sizeof(dist));
for(int i=; i<n; i++)
dist[i][i] = ;
for(int i=; i<m; i++)
{
scanf("%s%s", s1, s2);
dist[getId(s1)][getId(s2)] = ;
} for(int k=; k<n; k++)
for(int i=; i<n; i++)
for(int j=; j<n; j++)
dist[i][j] = dist[i][j]||(dist[i][k]&&dist[k][j]); if(cases > ) printf("\n");
printf("Calling circles for data set %d:\n", ++cases); memset(vis, , sizeof(vis));
for(int i = ; i < n; i++)
if(!vis[i])
{
printf("%s", names[i].c_str());
dfs(i);
printf("\n");
}
}
return ;
}
UVa(247),Floyd做传递闭包的更多相关文章
- World Finals 1996 Uva 247 (Floyd求闭包)
思路:用Floyd求传递闭包. 附:逗号后的空格没看到,WA了好多次…….还有就是强连通分量也可以做,但是对这个题来说太麻烦,而且不方便输出,. 代码如下: #include<iostream& ...
- Calling Circles(UVa 247)(Floyd 算法)
用Floyd算法求出传递闭包,然后用dfs求出每条连通分量.注意其中用到的几个小技巧: #include<cstdio> #include<iostream> #include ...
- UVA - 247 Calling Circles(Floyd求传递闭包)
题目: 思路: 利用Floyd求传递闭包(mp[i][j] = mp[i][j]||(mp[i][k]&&mp[k][j]);),当mp[i][j]=1&&mp[j][ ...
- POJ 3660 Cow Contest ( 最短路松弛思想应用 && Floyd求传递闭包 )
题意 : 给出 N 头奶牛在比赛的结果,问你最多的能根据给出结果确定其名次的奶牛头数.结果给出的形式为 A B 代表在比赛当中 A 战胜了 B 分析 : 对于一头奶牛来说,如果我们能确定其他 N - ...
- UVa 247 - Calling Circles(Floyd求有向图的传递闭包)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量的点)
题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归 ...
- UVA 247 电话圈(Floyd传递闭包+输出连通分量)
电话圈 紫书P365 [题目链接]电话圈 [题目类型]Floyd传递闭包+输出连通分量 &题解: 原来floyd还可以这么用,再配合连通分量,简直牛逼. 我发现其实求联通分量也不难,就是for ...
- UVa 247 电话圈(Floyd传递闭包)
https://vjudge.net/problem/UVA-247 题意: 如果两个人相互打电话,则说他们在同一个电话圈里.例如,a打给b,b打给c,c打给d,d打给a,则这4个人在同一个圈里:如果 ...
- UVA 247"Calling Circles"(floyd求传递闭包+SCC)
传送门 题意: 如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里. (a,b) 表示 a 打给 b: 例如,(a,b),(b,c),(c,d),(d,a),则这四个人在同一个电话圈里: 输 ...
随机推荐
- 使用MJExtension中要注意的地方
MJExtension git地址 https://github.com/CoderMJLee/MJExtension#JSON_Model Model contains model-array[模 ...
- Leetcode: Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
- codevs 1201 最小数和最大数
http://codevs.cn/problem/1201/ 1201 最小数和最大数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题 ...
- Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...
- eclipse批量删除断点(转)
1.首先调出BreakPoints选项卡(Window--show View--Other--BreakPoints). 2.选择BreakPoints选项卡,选择所有断点,点击删除即可.
- C++之路进阶——codevs3287(货车运输)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n ...
- . ToString(),Convert.ToString(),(string),as比较:
http://www.cnblogs.com/chehaoj/archive/2010/02/23/1671955.html 通常 object 到 string 有四种方式(假设有object ob ...
- AP模块的发票过账后关联对应的凭证编号。
--AP发票 SELECT GJH.NAME,GJH.LEDGER_ID,GJH.JE_CATEGORY, GJH.JE_SOURCE,XDL.SOURCE_DISTRIBUTION_TYPE, XT ...
- 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)
1.我们都知道在struts2中为防止浏览器绕过struts过滤器直接请求页面,所以我们都会配置一个拦截所有页面的action,如下: <action name="*"> ...
- Java编程思想重点
1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意 ...