如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里。例如,
a打给b,b打给c,
c打给d,d打给a,则这4个人在同一个圈里;如果e打给f但f不打给e,则不能推
出e和f在同一个电话圈里。
输入n(n≤25)个人的m次电话,找出所有电话圈。人名只包含字
母,不超过25个字符,且不重复
对于一个有向图,Floyd 找环,传递闭包
F[ i ][ j ] |= F[i][k] &&F[k][j]
F[i] [j] =1 表示i,j 在一个圈里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <iostream> #include <vector> #include <map> #include <queue> #include <cstring> using namespace std; const int N=300; int a[N][N],vis[N],n,m; int tot; map<string, int > id; map< int ,string> mp; int cas=0; void solve(){ int i,j,k,x,y; string s1,s2; tot=0; for (i=1;i<=m;i++){ cin>>s1>>s2; if (!id.count(s1)) id[s1]=++tot,mp[tot]=s1; if (!id.count(s2)) id[s2]=++tot,mp[tot]=s2; a[id[s1]][id[s2]]=1; } for (k=1;k<=n;k++) for (i=1;i<=n;i++) for (j=1;j<=n;j++) a[i][j]|=(a[i][k]&&a[k][j]); printf ( "Calling circles for data set %d:\n" ,++cas); queue<string> q; for (i=1;i<=n;i++){ if (vis[i]) continue ; vis[i]=1; q.push(mp[i]); for (j=i+1;j<=n;j++){ if (a[i][j]&&a[j][i]){ vis[j]=1; q.push(mp[j]); } } while (q.size()>1) cout<<q.front()<< ", " , q.pop(); cout<<q.front() <<endl; q.pop(); } } signed main(){ //freopen("in","r",stdin); while (cin>>n>>m,n){ memset (vis,0, sizeof vis); memset (a,0, sizeof a); id.clear(); mp.clear(); solve(); } } |
分类:
图论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!