//@auther Yang Zongjun
#include <iostream>
#include <cstdio>
#include <vector>
#include <string.h>
//#include <string>
#include <cstring>
using namespace std;
#define PI acos(-1.0)
#define EPS 1e-8
const int N = 1005;
const int INF = 2100000000;
vector<int> edge[N];
int query[N][N],father[N],count[N],indeg[N];
int vis[N],n,m;
int findSet(int x){
if(x!=father[x]){
father[x]=findSet(father[x]);
}
return father[x];
}
void Tarjan(int u){
father[u]=u;
for(int i=0;i<edge[u].size();i++){
Tarjan(edge[u][i]);
father[edge[u][i]]=u;
}
vis[u]=1;
for(int i=1;i<=n;i++)
if(vis[i] && query[u][i])
count[findSet(i)]+=query[u][i];
}
int main()
{
//freopen("C:/Users/Admin/Desktop/input.txt", "r", stdin);
//while(cin >> n)
while(scanf("%d", &n) != EOF)
{
//cin >> n;
//while(n--)
//{
for(int i = 1; i <= n; i++)
{
edge[i].clear();
}
memset(query, 0, sizeof(query));
memset(vis, 0, sizeof(vis));
memset(count, 0, sizeof(count));
memset(indeg, 0, sizeof(indeg));
int u, v, num; char c;
int t = n;
while(t--)
//for(int j = 0; j < n; j++)
{
//cin >> u >> c >> c >> num >> c;
scanf("%d:(%d)", &u, &num);
//cout << u << " " << num << u + num << endl;
while(num--)
{
//cin >> v;//cout << v << endl;
scanf(" %d", &v);
edge[u].push_back(v);
indeg[v]++;
}
}
//}
scanf("%d", &m);
//int u, v; char c;
while(m--)
{
scanf(" (%d %d)", &u, &v);
//cin >> c >> u >> v >> c;
//cout << u << v << endl;
query[u][v]++;
query[v][u]++;
}
for(int i = 1; i <= n; i++)
{
if(indeg[i] == 0)
{
Tarjan(i);break;
}
}
for(int i = 1; i <= n; i++)
{
if(count[i])
{
//cout << i << ":" << count[i] << endl;
printf("%d:%d\n", i, count[i]);
}
}
}
return 0;
}
[NWPU][2014][TRN][22]RMQ和LCA E - LCA POJ 1470
最新推荐文章于 2019-10-28 11:28:51 发布