結果
| 問題 |
No.416 旅行会社
|
| ユーザー |
|
| 提出日時 | 2025-03-30 14:29:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 315 ms / 4,000 ms |
| コード長 | 1,754 bytes |
| コンパイル時間 | 2,466 ms |
| コンパイル使用メモリ | 214,020 KB |
| 実行使用メモリ | 17,628 KB |
| 最終ジャッジ日時 | 2025-03-30 14:29:44 |
| 合計ジャッジ時間 | 7,415 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define dg pair<int,int>
#define a first
#define b second
#define mk(x,y) make_pair(x,y)
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch&15);
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)write(x/10);
putchar(x%10+'0');
return;
}
int tot,fa[100010],ans[100010];
vector<int>tp[100010];
dg qry[200010];
set<dg>edge;
inline int findfa(int x){return !fa[x]?x:fa[x]=findfa(fa[x]);}
inline bool find(int x,int y){return findfa(x)==findfa(y); }
inline void merge(int x,int y)
{
x=findfa(x),y=findfa(y);
if(x==y)return;
if(fa[x]>fa[y])swap(x,y);
fa[x]+=fa[y];
fa[y]=x;
}
int main()
{
int n=read(),m=read(),q=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read();
if(u>v)swap(u,v);
edge.insert(mk(u,v));
}
for(int i=1;i<=q;++i)
{
int u=read(),v=read();
if(u>v)swap(u,v);
edge.erase(mk(u,v));
qry[i]=mk(u,v);
}
for(auto syh:edge)merge(syh.a,syh.b);
for(int i=1;i<=n;++i)
if(find(1,i))
ans[i]=-1;
for(int i=1;i<=n;++i)tp[findfa(i)].emplace_back(i);
for(int i=q;i;--i)
{
int x=findfa(qry[i].a),y=findfa(qry[i].b);
if(x==y)continue;
if(find(1,y))swap(x,y);
if(find(1,x))
for(auto t:tp[y])
ans[t]=i;
if(tp[x].size()<tp[y].size())swap(tp[x],tp[y]);
tp[x].insert(tp[x].end(),tp[y].begin(),tp[y].end());
tp[y].clear();
merge(x,y);
swap(tp[findfa(x)],tp[x]);
}
for(int i=1;i<n;++i)write(ans[i+1]),puts("");
return 0;
}
/*
6 7 5
1 2
1 6
2 4
2 3
3 5
4 5
5 6
2 3
2 4
1 2
4 5
1 6
*/