昨晚写错了,把数组名head2写成了head,浪费了一个来小时。。。
tarjan离线搞,不言语:
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
const int MAX = 1024;
struct edge {
int from;
int to;
int next;
edge(int _from, int _to, int _next) {
from = _from;
to = _to;
next = _next;
}
};
struct query {
int u;
int v;
int id;
int next;
query(int _u, int _v, int _id, int _next) {
u = _u;
v = _v;
id = _id;
next = _next;
}
};
vector<edge> G;
vector<query> my;
int head[MAX], head2[MAX];
int LCA[MAX*MAX];
int in[MAX]; //in degree
int father[MAX];
int n, m, root;
inline void add_edge(int a, int b) {
G.push_back(edge(a, b, head[a]));
head[a] = G.size() - 1;
}
inline void add_query(int a, int b, int id) {
my.push_back(query(a, b, id, head2[a]));
head2[a] = my.size() - 1;
}
inline int read() {
char ch;
while ((ch = getchar()) < '0' || ch > '9') {
}
int x = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + ch - '0';
}
return x;
}
int find(int x) {
return x == father[x] ? x : father[x] = find(father[x]);
}
void tarjan(int u) {
father[u] = u;
for (int j = head2[u]; ~j; j = my[j].next) {
//printf("vis %d\n", my[j].v);
if (~father[my[j].v]) {
LCA[my[j].id] = find(my[j].v);
//printf("LCA[%d] = %d\n", my[j].id, LCA[my[j].id]);
}
}
for (int j = head[u]; ~j; j = G[j].next) {
if (father[G[j].to] == -1) {
tarjan(G[j].to);
father[G[j].to] = u;
}
}
}
int main() {
//freopen("1470.in", "r", stdin);
while (~scanf(" %d", &n)) {
memset(father, -1, sizeof(father));
memset(head, -1, sizeof(head));
memset(head2, -1, sizeof(head2));
memset(in, 0, sizeof(in));
G.clear();
my.clear();
int u, v;
for (int i = 1; i <= n; ++i) {
u = read();
int c = read();
while (c--) {
v = read();
add_edge(u, v);
//add_edge(v, u);
++in[v];
}
}
m = read();
for (int i = 1; i <= m; ++i) {
u = read();
v = read();
add_query(u, v, i);
add_query(v, u, i);
}
for (int i = 1; i <= n; ++i) {
if (in[i] == 0) {
root = i;
break;
}
}
tarjan(root);
map<int, int> ans;
for (int i = 1; i <= m; ++i) {
ans[LCA[i]]++;
}
for (map<int, int>::iterator it = ans.begin(); it != ans.end(); ++it) {
printf("%d:%d\n", it->first, it->second);
}
if (m) getchar();
}
return 0;
}