World Finals 1996 Uva (Floyd求闭包)
Posted icode-xiaohu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了World Finals 1996 Uva (Floyd求闭包)相关的知识,希望对你有一定的参考价值。
思路:用Floyd求传递闭包。
附:逗号后的空格没看到,WA了好多次……。还有就是强连通分量也可以做,但是对这个题来说太麻烦,而且不方便输出,。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> using namespace std; int n,m; map<string,int> ma; map<int,string> mb; int maps[50][50],vis[50]; void dfs(int u) { vis[u] = 1; for(int i = 1;i <= n;i++) { if(!vis[i] && maps[u][i] && maps[i][u]) { cout<<", "<<mb[i]; dfs(i); } } return ; } int main() { string a,b; int tot,u,v,ca = 0 ; while(~scanf("%d%d",&n,&m)) { if(n+m == 0) break; ma.clear(); mb.clear(); memset(maps,0,sizeof(maps)); tot = 1; for(int i = 1;i <= m;i++) { cin>>a>>b; if(!ma[a]) ma[a] = tot++; if(!ma[b]) ma[b] = tot++; u = ma[a]; v = ma[b]; mb[u] = a; mb[v] = b; maps[u][v] = 1; } for(int k = 1;k <= n;k++) { for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) { maps[i][j] = maps[i][j] || (maps[i][k]&&maps[k][j]); } } } memset(vis,0,sizeof(vis)); if(!ca) puts(""); printf("Calling circles for data set %d:\n",++ca); for(int i = 1;i <= n;i++) { if(!vis[i]) { cout<<mb[i]; dfs(i); cout<<endl; } } } }
以上是关于World Finals 1996 Uva (Floyd求闭包)的主要内容,如果未能解决你的问题,请参考以下文章
[UVa 213]Message Decoding,ACM/ICPC World Finals 1991 信息解码
[算法竞赛入门经典] Crossword Answers ACM/ICPC World Finals 1994,UVa232
[算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213
[算法竞赛入门经典]Repeating Decimals, ACM/ICPC World Finals 1990,UVa202
习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)
习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)