結果
| 問題 |
No.416 旅行会社
|
| ユーザー |
rapurasu
|
| 提出日時 | 2016-08-27 00:55:06 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 592 ms / 4,000 ms |
| コード長 | 2,792 bytes |
| コンパイル時間 | 1,876 ms |
| コンパイル使用メモリ | 171,272 KB |
| 実行使用メモリ | 22,792 KB |
| 最終ジャッジ日時 | 2024-12-14 19:58:55 |
| 合計ジャッジ時間 | 8,829 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
int par1[200001];
int par2[200001];
int rank1[200001];
long long ans[200001];
//n要素で初期化
void init(int n){
for(int i=0;i<n;i++){
par1[i]=i;
rank1[i]=0;
}
}
//木の根を求める
int find(int x){
if(par1[x] ==x){
return x;
}else{
int a=par1[x];
par1[x]=find(par1[x]);
//cout<<ans[x]<<ans[par1[x]]<<endl;
ans[x]=max(ans[x],ans[a]);
//cout<<x<<"a"<<ans[x]<<endl;
return par1[x];
}
}
//xとyの属する集合を併合
void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;
if(x==0){
par1[y]=x;
return;
}
if(y==0){
par1[x]=y;
return;
}
if(rank1[x]<rank1[y]){
par1[x]=y;
}else{
par1[y]=x;
rank1[x]++;
}
}
//xとyが同じ集合に属するか否か
bool same(int x,int y){
return find(x)==find(y);
}
int N,M,Q;
typedef pair<int,int>P;
vector<P>v;
vector<P>v2;
vector<P>b2;
map<P,int>m;
int main(){
REP(i,200001){
ans[i]=0;
}
init(200001);
cin>>N>>M>>Q;
REP(i,M){
int a,b;
cin>>a>>b;
v.push_back(P(a-1,b-1));
}
REP(i,Q){
int c,d;
cin>>c>>d;
m[P(c-1,d-1)]=0;
b2.push_back(P(c-1,d-1));
}
REP(i,v.size()){
if(m.find(v[i])==m.end()){
v2.push_back(v[i]);
}
}
REP(i,v2.size()){
unite(v2[i].first,v2[i].second);
}
REP(i,N){
if(same(0,i)){
ans[i]=-1;
}
}
REP(i,200001){
par2[i]=par1[i];
}
long long count=Q;
for(int i=b2.size()-1;i>=0;i--){
P p=b2[i];
int c=find(p.first);
int d=find(p.second);
unite(c,d);
if(same(c,0)&&ans[c]==0){
ans[c]=max(count,ans[c]);
/*REP(i,N){
if(same(i,0)&&ans[i]==0){
ans[i]=count;
}
}*/
}
if(same(d,0)&&ans[d]==0){
ans[d]=max(count,ans[d]);
/*REP(i,N){
if(same(i,0)&&ans[i]==0){
ans[i]=count;
}
}*/
}
count--;
}
REP(i,N){
find(i);
}
for(int i=1;i<N;i++){
cout<<ans[i]<<endl;
}
return(0);
}
rapurasu