uva 247 calling circles

来源:互联网 发布:linux 给其他用户授权 编辑:程序博客网 时间:2024/05/21 21:43

图的连通性问题。两个人相互连通当且仅当两人互相直接或者间接打过电话。

因为间接通话的存在,无法直接用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;}



0 0
原创粉丝点击