比赛 |
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;
}