题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=183
紫书365页,用Floyd做传递闭包,然后深搜,其实可以不用找前驱,没有一定的顺序,爆搜一边就可以了。
然后是名字的导入,用vector处理就很好了。没有找到,就加到后面。
freopen没有注释掉,WA得我想哭。
names没清空,RE得想死。
#include <cstdio> #include <cstring> #include <string> #include <iostream> #include <vector> using namespace std; int dist[100][100]; bool vis[100]; int n,m; vector<string> names; int getId(const string &s) { for(int i=0; i<names.size(); i++) if(names[i]==s) return i; names.push_back(s); return names.size()-1; } void dfs(int u) { vis[u] = 1; for(int v=0; v<n; v++) if(!vis[v]&&dist[u][v]&&dist[v][u]) { printf(", %s", names[v].c_str()); dfs(v); } } int main() { char s1[99], s2[99]; int cases = 0; //freopen("input.txt","r",stdin); while(scanf("%d%d",&n,&m),n) { names.clear(); memset(dist,0,sizeof(dist)); for(int i=0; i<n; i++) dist[i][i] = 1; for(int i=0; i<m; i++) { scanf("%s%s", s1, s2); dist[getId(s1)][getId(s2)] = 1; } for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++) dist[i][j] = dist[i][j]||(dist[i][k]&&dist[k][j]); if(cases > 0) printf(" "); printf("Calling circles for data set %d: ", ++cases); memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; i++) if(!vis[i]) { printf("%s", names[i].c_str()); dfs(i); printf(" "); } } return 0; }