列表

详情


NC235366. Connect Graph

描述

有一个  个点, 条边的无向图,现在要在这个图上按顺序添加  条无向边,每新添加一条边需要花费  天时间,问每个点最早何时与  号点联通。
注:以未加“之后的 m_2 条边”时作为第 0 天,即第 0 天时图上就有  条边,加入第一条边的时间为第一天,若加入第 i 条边之后某个点与  号点联通,且在此之前该点与 1 号点不联通,则称该点与点  联通的时间i

输入描述

第一行一个整数 

第二行两个整数 

下面  行,一行两个整数 ,表示初始的一条边。

下面  行,一行两个整数 ,表示新添加的一条边。

输出描述

共  行,对于第  行输出一个整数表示点  与点  联通的时间,如果永远无法与点  联通,输出 

示例1

输入:

5
0 7
1 2
3 4
2 5
1 5
4 3
1 4
2 4

输出:

0
1
6
6
3

说明:

如图,其中边上的数字为加入这条边的时间。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 88ms, 内存消耗: 3932K, 提交时间: 2022-10-14 19:38:47

#include<bits/stdc++.h>
using namespace std;
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
#define mod 998244353
#define N 400005
int n,m,k,cn,fa[N],ans[N];
int find(int x){
	if(x==fa[x])return x;
	int ff=find(fa[x]);
	if(ans[x]<ans[fa[x]])ans[x]=ans[fa[x]];
	return fa[x]=ff;
}
void join(int u,int v,int ew){
	int fu=find(u),fv=find(v);
	if(fu==fv)return;
	if(fu==1)swap(fu,fv);
	if(fv==1){
		fa[fu]=fv;
		ans[fu]=ew;
		return ;
	}
	ans[++cn]=ew;
	fa[fu]=fa[fv]=cn;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	cn=n;
	fr(i,1,n+n)fa[i]=i;
	fr(i,1,m){
		int u,v;
		scanf("%d%d",&u,&v);
		join(u,v,0);
	}
	fr(i,1,k){
		int u,v;
		scanf("%d%d",&u,&v);
		join(u,v,i);
	}
	fr(i,1,n){
		if(find(i)!=find(1))puts("-1");
		else printf("%d\n",ans[i]);
	}
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 705ms, 内存消耗: 20720K, 提交时间: 2022-12-04 22:40:19

#include<bits/stdc++.h>
using namespace std;
int b[200005];
vector<pair<int,int>>s[200005];
void bfs(int i,int ma)
{
    b[i]=ma;
    for(int j=0;j<s[i].size();j++)
    {
        int ma1=max(ma,s[i][j].second);
        if(b[s[i][j].first]==-1 || b[s[i][j].first]>ma1)
            bfs(s[i][j].first,ma1);
    }
}
int main(){
    memset(b,-1,sizeof(b));
    int n,x,y; cin>>n>>x>>y;
    for(int i=0;i<x;i++){
        int u,v; cin>>u>>v;
        s[u].push_back({v,0});
        s[v].push_back({u,0});
    }
    for(int i=1;i<=y;i++){
        int u,v; cin>>u>>v;
        s[u].push_back({v,i});
        s[v].push_back({u,i});
    }
    bfs(1,0);
    for(int i=1;i<=n;i++) cout<<b[i]<<endl;
}

上一题