uva 247 calling circles
2015-09-09 17:58
465 查看
图的连通性问题。两个人相互连通当且仅当两人互相直接或者间接打过电话。
因为间接通话的存在,无法直接用dfs来求连通块。要用Floyd算法实现的传递闭包
来预处理两人是否直接或间接的通过话。Floyd算法完后则可以用dfs求出所有连通块了。
因为间接通话的存在,无法直接用dfs来求连通块。要用Floyd算法实现的传递闭包
来预处理两人是否直接或间接的通过话。Floyd算法完后则可以用dfs求出所有连通块了。
// Created by Chenhongwei in 2015. // Copyright (c) 2015 Chenhongwei. All rights reserved. #include"iostream" #include"cstdio" #include"cstdlib" #include"cstring" #include"climits" #include"queue" #include"cmath" #include"map" #include"set" #include"stack" #include"vector" #include"sstream" #include"algorithm" using namespace std; typedef long long ll; vector<string > name; int n,m,vis[30],d[30][30]; int ID(const string& s) { for(int i=0;i<name.size();i++) if(name[i]==s) return i; name.push_back(s); return name.size()-1; } void dfs(int u) { vis[u]=1; for(int v=0;v<n;v++) if(!vis[v]&&d[u][v]&&d[v][u]) { cout<<", "<<name[v]; dfs(v); } } int main() { ios::sync_with_stdio(false); // freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int kase=0; string s,t; while(cin>>n>>m&&n+m) { if(kase) cout<<endl; cout<<"Calling circles for data set "<<++kase<<":\n"; name.clear(); memset(vis,0,sizeof vis); memset(d,0,sizeof d); for(int i=1;i<30;i++) d[i][i]=1; while(m--) { cin>>s>>t; d[ID(s)][ID(t)]=1; } for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) d[i][j]|=d[i][k]&&d[k][j]; for(int i=0;i<n;i++) if(!vis[i]) { cout<<name[i]; dfs(i); cout<<endl; } } return 0; }
相关文章推荐
- MySQL添加用户、删除用户与授权
- c# webapi 开发
- Centos7 安装kilo-3 controller(keystone)
- redis源码解析,不定期更新记录
- 再看知名应用背后的第三方开源项目
- JavaScript并非“按值传递”
- 工作笔记7
- Exception in thread "main" org.hibernate.MappingException: Unknown entity: XXX
- Chrome下cookie无法使用
- 前端工程师技能之photoshop巧用(从效果图到雪碧图)5——理论篇
- java并发与线程池应用
- LGPL协议的理解
- tableView点击Cell跳转传值(segue,storyBoard传值)
- Android ViewPager和Fragment实现顶部导航界面滑动效果
- find -mtime +30
- 黑马程序员--TCP通信
- .Pvr ---> .Png
- android存储数据的四种方式
- Intellij IDEA 快捷键工具大全
- 工作笔记5