#include<iostream>
#include<vector>
using namespace std;
int n,m,e,k;
vector<int>q[100010];
struct tt
{
int to;
int w;
int next;
}edge[10000000];
struct t1
{
int x;
int y;
int ff;
}ans[10005];
int head[100010],vis[100010],dis[100010],father[100010];
void add(int a,int b,int c)
{
edge[e].w=c;
edge[e].to=b;
edge[e].next=head[a];
head[a]=e;
e++;
}
void init()
{
int i;
for(i=1;i<=n;i++)
father[i]=i;
}
int find(int a)
{
if(father[a]!=a)
father[a]=find(father[a]);
return father[a];
}
void make(int a,int b)
{
int f1=find(a);
int f2=find(b);
if(f1!=f2)
father[f1]=f2;
}
void lca(int x)
{
int i,j;
vis[x]=1;
for(i=head[x];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]==0)
{
dis[v]=dis[x]+edge[i].w;
lca(v);
make(v,x);
}
}
for(i=0;i<q[x].size();i++)
{
if(vis[q[x][i]]==1)
{
for(j=0;j<k;j++)
if(ans[j].x==x&&ans[j].y==q[x][i]||ans[j].x==q[x][i]&&ans[j].y==x)
{
int t=find(q[x][i]);
ans[j].ff=dis[x]+dis[q[x][i]]-2*dis[t];
}
}
}
}
int main()
{
while(cin>>n>>m)
{
init();
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
e=0;
int i,j;
int a,b,c;
char s;
for(i=1;i<=m;i++)
{
scanf("%d%d%d %c",&a,&b,&c,&s);
add(a,b,c);
add(b,a,c);
}
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
q[a].push_back(b);
q[b].push_back(a);
ans[i].x=a;
ans[i].y=b;
}
lca(1);
for(i=0;i<k;i++)
printf("%d\n",ans[i].ff);
}
return 0;
}
poj1986
最新推荐文章于 2020-05-29 18:05:39 发布