http://acm.hdu.edu.cn/showproblem.php?pid=4039
就是实现简单的好友推荐系统。~TLE好多次~
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
5723360 | 2012-04-07 12:41:02 | Accepted | 4039 | 515MS | 3032K | 2055 B | G++ | ahfywff |
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
const int maxn = 2010;
int t, n, q;
char f[maxn][2][20];
vector<string> v;
map<string, int> m;
int idx, head[maxn];
int cnt[maxn];
bool r[maxn][maxn];
struct Edge
{
int u, v, next;
}edge[maxn];
void addEdge(int u, int v)
{
edge[idx].u = u;
edge[idx].v = v;
edge[idx].next = head[u];
head[u] = idx++;
}
int main()
{
scanf("%d", &t);
for (int cas = 1; cas <= t; ++cas)
{
scanf("%d %d", &n, &q);
v.clear();
for (int i = 0; i < n; ++i)
{
scanf("%s\n%s", f[i][0], f[i][1]);
v.push_back(f[i][0]);
v.push_back(f[i][1]);
}
sort(v.begin(), v.end());
int size = v.size(), tot = 1;
for (int i = 1; i < size; ++i)
{
if (v[i] != v[i-1])
v[tot++] = v[i];
}
m.clear();
for (int i = 0; i < tot; ++i)
{
m[v[i]] = i;
}
idx = 0;
for (int i = 0; i < tot; ++i)
head[i] = -1;
for (int i = 0; i < tot; ++i)
for (int j = 0; j < tot; ++j)
r[i][j] = false;
for (int i = 0; i < n; ++i)
{
int a = m[f[i][0]], b = m[f[i][1]];
addEdge(a, b); addEdge(b, a);
r[a][b] = r[b][a] = true;
}
printf("Case %d:\n", cas);
char s[20];
for (int i = 0; i < q; ++i)
{
for (int j = 0; j < tot; ++j)
cnt[j] = 0;
scanf("%s", s);
int Max = -1, u = m[s];
for (int j = head[u]; j != -1; j = edge[j].next)
{
for (int k = head[edge[j].v]; k != -1; k = edge[k].next)
{
int v = edge[k].v;
if (u == v || r[u][v])
continue;
++cnt[v];
}
}
for (int j = 0; j < tot; ++j)
{
if (cnt[j] > Max)
Max = cnt[j];
}
if (Max == 0)
printf("-\n");
else
{
int flag = 0;
for (int j = 0; j < tot; ++j)
{
if (cnt[j] == Max)
{
if (flag)
printf(" ");
printf("%s", v[j].c_str());
++flag;
}
}
printf("\n");
}
}
}
return 0;
}