結果

問題 No.416 旅行会社
ユーザー vjudge1vjudge1
提出日時 2024-12-22 17:22:39
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,811 bytes
コンパイル時間 1,864 ms
コンパイル使用メモリ 171,508 KB
実行使用メモリ 33,536 KB
最終ジャッジ日時 2024-12-22 17:23:28
合計ジャッジ時間 47,600 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2,880 ms
33,536 KB
testcase_01 WA -
testcase_02 AC 2 ms
25,984 KB
testcase_03 AC 2 ms
10,624 KB
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 2,928 ms
18,432 KB
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 TLE -
testcase_15 TLE -
testcase_16 TLE -
testcase_17 TLE -
testcase_18 TLE -
testcase_19 TLE -
testcase_20 TLE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
int x,y,n,m,q,c1=0,c2=0,h[100005],hd[100005],f[100005],ans[100005];
struct nd{
	int u,v,nxt,num,tg;
}e1[400005],e2[400005];
int fd(int q){
	if(f[q]==q) return q;
	return fd(f[q]);
}
int fans(int q){
	if(f[q]==q&&q==1) return -1;
	if(f[q]==q) return 0;
	if(ans[q]) return ans[q];
	return ans[q]=fans(f[q]);
}
void jb(int u,int v,int ad){
	if(!ad){
		e1[++c1].u=u;
		e1[c1].v=v;
		e1[c1].nxt=h[u];
		h[u]=c1;
	}else{
		e2[++c2].u=u;
		e2[c2].v=v;
		e2[c2].nxt=hd[u];
		hd[u]=c2;
		e2[c2].num=ad;
	}
}
bool cmp(nd a,nd b){
	if(a.u==b.u) return a.v<b.v;
	return a.u<b.u;
}
bool cmp2(nd a,nd b){
	return a.num>b.num;
}
signed main(){
//	freopen("evacuate.in","r",stdin);
//	freopen("evacuate.out","w",stdout);
	cin>>n>>m>>q;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		jb(x,y,0);
		jb(y,x,0);
	}for(int i=1;i<=q;i++){
		scanf("%d%d",&x,&y);
		jb(x,y,i);
		jb(y,x,i);
	}sort(e1+1,e1+m*2+1,cmp);
	sort(e2+1,e2+q*2+1,cmp);
	for(int i=1,j=1;i<=q*2;i++,j++){
		if(e1[j].u==e2[i].u&&e1[j].v==e2[i].v) e1[j].tg=e1[j].tg=0;
		else{
			while(e1[j].u!=e2[i].u||e1[j].v!=e2[i].v){
				e1[j].tg=1;
				j++;
			}e1[j].tg=0;
		}
	}for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=n;i++) ans[i]=0;
	for(int i=1;i<=m*2;i++){
		if(e1[i].tg){
			int u=e1[i].u,v=e1[i].v,fu=fd(u),fv=fd(v),f1=fd(1);
			if(fu==f1||fv==f1) ans[u]=ans[v]=-1;
			f[fu]=fv;
		}
	}sort(e2+1,e2+q*2+1,cmp2);
	for(int i=1;i<=q*2;i++){
		int u=e2[i].u,v=e2[i].v,fu=fd(u),fv=fd(v),f1=fd(1);
//		if(u==2||v==2) cout<<u<<" "<<v<<" "<<fu<<" "<<fv<<" "<<f1<<"\n";
		if(fu==f1){
			if(!ans[v]) ans[v]=max(e2[i].num,fans(v));
			if(!ans[u]) ans[u]=fans(u);
		}else if(fv==f1){
			if(!ans[u]) ans[u]=max(e2[i].num,fans(u));
			if(!ans[v]) ans[v]=fans(v);
		}
		f[fv]=fu;
	}
	for(int i=2;i<=n;i++) printf("%d\n",ans[i]);
} 
0