You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
C++
65 lines
1.8 KiB
C++
#define _CRT_SECURE_NO_WARNINGS
|
|
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
struct biHash
|
|
{
|
|
int sz = 0;
|
|
map<string, int> h1;
|
|
map<int, string> h2;
|
|
int insert(const string &s)
|
|
{
|
|
auto ite = h1.find(s);
|
|
if (ite == h1.end())
|
|
{
|
|
int id = sz++;
|
|
h1[s] = id;
|
|
h2[id] = s;
|
|
return id;
|
|
}
|
|
else
|
|
return ite->second;
|
|
}
|
|
string &query(int key) { return h2[key]; }
|
|
int query(const string &key) { return h1[key]; }
|
|
void reset() { sz = 0, h1.clear(), h2.clear(); }
|
|
};
|
|
const int N = 30;
|
|
int dis[N][N], vis[N];
|
|
string s1, s2;
|
|
biHash H;
|
|
int main()
|
|
{
|
|
for (int t = 1, n, m; scanf("%d%d", &n, &m), n | m; t++)
|
|
{
|
|
H.reset();
|
|
memset(dis, 0, sizeof(dis));
|
|
memset(vis, 0, sizeof(vis));
|
|
for (int i = 0; i < N; i++) dis[i][i] = 1;
|
|
for (int i = 0; i < m; i++)
|
|
{
|
|
cin >> s1 >> s2;
|
|
int id1 = H.insert(s1);
|
|
int id2 = H.insert(s2);
|
|
dis[id1][id2] = 1;
|
|
}
|
|
for (int k = 0; k < n; k++)
|
|
for (int i = 0; i < n; i++)
|
|
for (int j = 0; j < n; j++)
|
|
dis[i][j] |= dis[i][k] & dis[k][j];
|
|
printf("Calling circles for data set %d:\n", t);
|
|
for (int i = 0; i < n; i++)
|
|
if (!vis[i])
|
|
{
|
|
printf("%s", H.query(i).c_str());
|
|
for (int j = 0; j < n; j++)
|
|
if (dis[i][j] & dis[j][i])
|
|
{
|
|
vis[j] = 1;
|
|
if (i != j) printf(", %s", H.query(j).c_str());
|
|
}
|
|
putchar('\n');
|
|
}
|
|
}
|
|
return 0;
|
|
} |