poj1986

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章