比赛 ZLXOI2015Day2 评测结果 AAAAAAAAAA
题目名称 ZLX的陨落 最终得分 100
用户昵称 JVendetta 运行时间 0.404 s
代码语言 C++ 内存使用 17.10 MiB
提交时间 2015-10-30 20:26:01
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 200010
using namespace std;
struct edge
{
	int from,to,next,how,dis;
}road[3][maxn];
int len[3],f[maxn],head[3][maxn],dist[maxn],ans[maxn];
bool vis[maxn],book[3][maxn];
int find(int x)
{
	return x==f[x]?x:f[x]=find(f[x]);
}
void marge(int x,int y)
{
	x=find(x),y=find(y);
	if(x!=y)
	    f[y]=x;
	return ;
}
void add(int a,int b,int x,int d,int k)
{
	++len[x];
	road[x][len[x]].from=a;
	road[x][len[x]].to=b;
	road[x][len[x]].how=d;
	road[x][len[x]].dis=k;
	road[x][len[x]].next=head[x][a];
	head[x][a]=len[x];
}
void init(int n)
{
	for(int i=1;i<=n;i++)
		f[i]=i;
	memset(head,-1,sizeof(head));
}
void Tarjin(int u,int dev)
{
	int i=1,e=head[i][u],a,b,k;
	while(e!=-1)
	{
		a=road[i][e].to;
		k=road[i][e].how;
		b=road[i][e].dis;
		if(!vis[a] && !book[i][k])
		{
			book[i][k]=1;
			dist[a]=dev+b;
			Tarjin(a,dev+b);
			vis[a]=1;
			marge(u,a);
		}
		e=road[i][e].next;
	}
	i++,e=head[i][u];
	while(e!=-1)
	{
		a=road[i][e].to;
		k=road[i][e].how;
		if(vis[a] && !book[i][k])
		{
			b=find(a);
			book[i][k]=1;
			ans[k]=dist[u]+dist[a]-2*dist[b];
		}
		e=road[i][e].next;
	}
	return ;
}
int main()
{
	freopen("ThefallingofZLX.in","r",stdin);
	freopen("ThefallingofZLX.out","w",stdout);
	int n,m,i,a,b,c,q,k;
	scanf("%d%d",&n,&m);
	init(n);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,1,i,c);
		add(b,a,1,i,c);
		k=min(a,b);
	}
	scanf("%d",&q);
	for(i=1;i<=q;i++)
	{
		scanf("%d%d",&a,&b);
		add(a,b,2,i,0);
		add(b,a,2,i,0);
	}
   	Tarjin(k,0);
   	for(i=1;i<=q;i++)
   	    printf("%d\n",ans[i]);
    return 0;
}