TLE on #125 求调
查看原帖
TLE on #125 求调
180406
FormulaOne楼主2024/8/10 16:20

rt,模拟赛数据过了,CF上寄了(


#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#pragma optimize("Ofast") 
#define N 1000001
#define ll long long
#define MAXN 1e16

using namespace std;

int n,m,k,T,tot,cnt;
ll dis[N * 5],a[N * 5];
int top[N * 5],siz[N * 5],son[N * 5],s[N * 5][2],hd[N * 5],dep[N * 5],f[N * 5],fa[N * 5];

struct E
{
	int u,v,nxt;
	ll w;
}e1[N * 5],e2[N * 5];

void add1( int u , int v , ll w )
{
	tot ++;
	e1[tot].v = v;
	e1[tot].w = w;
	e1[tot].nxt = hd[u];
	hd[u] = tot;
}

void add2( int u , int v , ll w )
{
	tot ++;
	e2[tot].u = u;
	e2[tot].v = v;
	e2[tot].w = w;
}

void dijk( void )
{
	priority_queue<ll,vector<pair<ll,int> >,greater<pair<ll,int> > > q; 
	int u,v;
	for( int i = 1 ; i <= n ; i ++ )
		dis[i] = MAXN;
	for( int i = 1 ; i <= k ; i ++ )
	{
		dis[i] = 0;
		q.push( make_pair( dis[i] , i ) );
	}
	while( !q.empty() )
	{
		u = q.top().second;
		q.pop();
		for( int i = hd[u] ; i ; i = e1[i].nxt )
		{
			v = e1[i].v;
			if( dis[u] + e1[i].w < dis[v] )
			{
				dis[v] = dis[u] + e1[i].w;
				q.push( make_pair( dis[v] , v ) );
			}
		}
	}
	return;
}

bool cmp( E x , E y )
{
	return x.w < y.w;
}

int lca( int u , int v )
{
	while( top[u] != top[v] )
	{
		if( dep[top[u]] >= dep[top[v]] )
			u = fa[top[u]];
		else
			v = fa[top[v]];
	}
	if( dep[u] > dep[v] ) swap( u , v );
	return u;
}

void dfs1( int u , int ff )
{
	dep[u] = dep[ff] + 1;
	siz[u] = 1;
	fa[u] = ff;
	int v;
	v = s[u][0];
	if( s[u][0] )
	{
		dfs1( v , u );
		siz[u] += siz[v];
		if( siz[v] > siz[son[u]] )
			son[u] = v;
	}
	v = s[u][1];
	if( s[u][1] )
	{
		dfs1( v , u );
		siz[u] += siz[v];
		if( siz[v] > siz[son[u]] )
			son[u] = v;
	}
	return;
}

void dfs2( int u , int ff , int flag )
{
	if( flag ) top[u] = u;
	else top[u] = top[ff];
	if( son[u] ) dfs2( son[u] , u , 0 );
	if( s[u][0] && s[u][0] != son[u] ) dfs2( s[u][0] , u , 1 );
	if( s[u][1] && s[u][1] != son[u] ) dfs2( s[u][1] , u , 1 );
	return;
}

int cx( int x )
{
	if( x == f[x] ) return x;
	return f[x] = cx( f[x] );
}

ll read( void )
{
	ll x = 0,f = 1;
	char ch = getchar();
	while( ch < '0' || ch > '9' ) ch = getchar();
	while( ch >= '0' && ch <= '9' ) x = x * 10 + ch - '0',ch = getchar();
	return x * f;
}

int main()
{
	int u,v,w;
	cin >> n >> m >> k >> T;
	for( int i = 1 ; i <= n ; i ++ )
		f[i] = i;
	for( int i = 1 ; i <= m ; i ++ )
	{
		u = read(),v = read(),w = read();
		add1( u , v , w );
		add1( v , u , w );		
	}
	cnt = n;
	dijk();
	tot = 0;
	for( u = 1 ; u <= n ; u ++ )
	{
		for( int i = hd[u] ; i ; i = e1[i].nxt )
		{
			v = e1[i].v;
			if( u < v )
			add2( u , v , dis[u] + dis[v] + e1[i].w );
		}
	}
	sort( e2 + 1 , e2 + m + 1 , cmp );
	for( int i = 1 ; i <= m ; i ++ )
	{
		u = cx( e2[i].u ),v = cx( e2[i].v );
		if( u == v ) continue;
		cnt ++;
		f[u] = f[v] = f[cnt] = cnt;
		s[cnt][0] = u,s[cnt][1] = v;
		a[cnt] = e2[i].w;
	}
	dfs1( cnt , 0 );
	dfs2( cnt , 0 , 1 );
	while( T -- )
	{
		u = read(),v = read();
		printf( "%lld\n" , a[lca( u , v )] );
	}
	return 0;
}

2024/8/10 16:20
加载中...