博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
紫书 例题11-4 UVa247 (Floyd判断联通)
阅读量:7027 次
发布时间:2019-06-28

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

Floyd联通, 然后为了输出联通分量而新建一个图, 让互相可以打电话的建立一条边, 然后dfs输出联通分量就ok了。

#include
#include
#include
#include
#include
#include
#define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 30;int d[MAXN][MAXN], g[MAXN][MAXN], vis[MAXN], n, m;map
id;vector
word;int get_id(string s){ if(id.count(s)) return id[s]; word.push_back(s); return id[s] = word.size() - 1; //注意这里要减去1}void print(int u, int p){ if(p != 1) printf(", "); cout << word[u]; vis[u] = 1; REP(v, 0, n) if(g[u][v] && !vis[v]) print(v, 0);}int main(){ int kase = 0; while(~scanf("%d%d", &n, &m) && n && m) { if(kase) puts(""); word.clear(); id.clear(); memset(d, 0, sizeof(d)); memset(vis, 0, sizeof(vis)); memset(g, 0, sizeof(g)); while(m--) { string a, b; cin >> a >> b; d[get_id(a)][get_id(b)] = 1; } REP(k, 0, n) REP(i, 0, n) REP(j, 0, n) d[i][j] = d[i][j] || (d[i][k] && d[k][j]); REP(i, 0, n) REP(j, 0, n) g[i][j] = (d[i][j] && d[j][i]); printf("Calling circles for data set %d:\n", ++kase); REP(i, 0, n) if(!vis[i]) { print(i, 1); puts(""); } } return 0; }

转载于:https://www.cnblogs.com/sugewud/p/9819548.html

你可能感兴趣的文章
BZOJ 1084 最大子矩阵
查看>>
2018杭电多校第三场1007(凸包,极角排序)
查看>>
django中orm的简单操作
查看>>
Mybatis知识(1)
查看>>
php处理网站url编码及乱码问题
查看>>
快速入门:selenium自动化测试+ubuntu系统+php语言+firefox/chrome浏览器
查看>>
docx 转 doc
查看>>
DD DT DL标签
查看>>
用window.open函数页面传值
查看>>
SPOJ 10707 COT2 - Count on a tree II
查看>>
数据绑定——Vue.js
查看>>
Max Mex
查看>>
[CentOS] 7 不执行文件 /etc/rc.d/rc.local
查看>>
模态窗口的各个属性
查看>>
10.28 (上午) 开课一个月零二十四天 (数据访问)
查看>>
为什么你应该(从现在开始就)写博客
查看>>
小技巧积累
查看>>
Java JDBC链接Oracle数据库
查看>>
Moss2010 部署命令
查看>>
Git 操作分支
查看>>