比赛 |
ZLXOI2015Day2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
ZLX的陨落 |
最终得分 |
100 |
用户昵称 |
高哥 |
运行时间 |
0.537 s |
代码语言 |
C++ |
内存使用 |
4.13 MiB |
提交时间 |
2015-10-30 20:42:11 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define N 100010
using namespace std;
int n,m,q,f[N],ans[N],dist[N];
int vis[N],r;
struct Edge{
int from,to,dist;
};
struct que{
int from,to;
};
//vector<Edge> edges;
vector<Edge> edge;
vector<que> ques;
vector<int> g[N];
vector<int> Q[N];
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
void add(int u,int v,int w)
{
edge.push_back((Edge){u,v,w});
int m=edge.size();
g[u].push_back(m-1);
}
void addq(int u,int v)
{
ques.push_back((que){u,v});
int m=ques.size();
Q[u].push_back(m-1);
}
void input()
{
scanf("%d%d",&n,&m);
int u,v,w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
r=u;
add(u,v,w);
add(v,u,w);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&u,&v);
addq(u,v);
addq(v,u);
}
}
void init()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
f[i]=i;
}
void tarjan(int x,int fa)
{
//cout<<dist[x]<<endl;
vis[x]=1;
for(int i=0;i<g[x].size();i++)
{
Edge u=edge[g[x][i]];
if(vis[u.to]==0)
{
dist[u.to]=dist[x]+u.dist;
tarjan(u.to,x);
}
}
for(int i=0;i<Q[x].size();i++)
{
int m=Q[x][i];
m/=2;
que u=ques[Q[x][i]];
if(vis[u.to]==2)
{
// cout<<u.to<<':'<<dist[u.to]<<' '<<x<<':'<<dist[x]<<' '<<find(u.to)<<':'<<dist[find(u.to)]<<endl;
ans[m]=dist[u.to]+dist[x]-2*dist[find(u.to)];
//cout<<ans[m]<<endl;
}
}
f[x]=fa;
vis[x]=2;
}
int main()
{
freopen("ThefallingofZLX.in","r",stdin);
freopen("ThefallingofZLX.out","w",stdout);
input();
init();
//sort(edges.begin(),edges.end());
//kruskal();
tarjan(r,r);
//cout<<q<<endl;
for(int i=0;i<q;i++)
printf("%d\n",ans[i]);
return 0;
}
/*
6 5
1 2 7
1 3 3
2 4 5
3 5 7
3 6 6
5
3 4
6 3
5 1
4 3
4 2
13 12
5 4 1
5 6 1
4 2 1
4 3 1
3 9 1
3 10 1
10 11 1
10 12 1
6 7 1
6 8 1
8 13 1
6 14 1
5
2 3
11 14
13 8
3 8
14 2
*/