連結 / Connectivity
Time limit : 2sec / Memory limit : 256MB
Score : 400 points
Problem Statement
There are N cities. There are also K roads and L railways, extending between the cities. The i-th road bidirectionally connects the pi-th and qi-th cities, and the i-th railway bidirectionally connects the ri-th and si-th cities. No two roads connect the same pair of cities. Similarly, no two railways connect the same pair of cities.
We will say city A and B are connected by roads if city B is reachable from city A by traversing some number of roads. Here, any city is considered to be connected to itself by roads. We will also define connectivity by railways similarly.
For each city, find the number of the cities connected to that city by both roads and railways.
Constraints
- 2≦N≦2*105
- 1≦K,L≦105
- 1≦pi,qi,ri,si≦N
- pi<qi
- ri<si
- When i≠j, (pi,qi)≠(pj,qj)
- When i≠j, (ri,si)≠(rj,sj)
Input
The input is given from Standard Input in the following format:
N K L p1 q1 : pK qK r1 s1 : rL sL
Output
Print N integers. The i-th of them should represent the number of the cities connected to the i-th city by both roads and railways.
Sample Input 1
4 3 1 1 2 2 3 3 4 2 3
Sample Output 1
1 2 2 1
All the four cities are connected to each other by roads.
By railways, only the second and third cities are connected. Thus, the answers for the cities are 1,2,2 and 1, respectively.
Sample Input 2
4 2 2 1 2 2 3 1 4 2 3
Sample Output 2
1 2 2 1
Sample Input 3
7 4 4 1 2 2 3 2 5 6 7 3 5 4 5 3 4 6 7
Sample Output 3
1 1 2 1 2 2 2
输出每个点的连接路数,(火车|公路)
思路:
当然是并查集的啦.
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5+7;
const int Inf = 0x3f3f3f3f;
int pre1[MAXN],pre2[MAXN];
int finds(int x,int *pre)
{
return pre[x] == x? pre[x]:pre[x] = finds(pre[x],pre);
}
void join(int x,int y,int *pre)
{
int px = finds(x,pre);
int py = finds(y,pre);
if( px!=py)
{
pre[px] = py;
}
}
int main()
{
int n,k,l;
cin>>n>>k>>l;
for(int i = 1;i<=n;i++)
pre1[i] = i,pre2[i] = i;
for(int i = 1;i<=k;i++)
{
int x,y;
cin>>x>>y;
join(x,y,pre1);
}
for(int i = 1;i<=l;i++)
{
int x,y;
cin>>x>>y;
join(x,y,pre2);
}
for(int i = 1;i<=n;i++)
{
finds(i,pre1);
finds(i,pre2);
}
map<pair<int,int>,int> mp;
for(int i = 1;i<=n;i++)
{
//cout<<pre1[i]<<" | "<<pre2[i]<<endl;
mp[make_pair(pre1[i],pre2[i])] ++;
}
for(int i = 1;i<=n;i++)
{
cout<<mp[make_pair(pre1[i],pre2[i])]<<" ";
}
cout<<endl;
}
1