Problem Description
There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to answer. But luckily int this village the answer is always
unique, since the roads are built in the way that there is a unique simple path("simple" means you can't visit a place twice) between every two houses. Yout task is to answer all these curious people.
Input
First line is a single integer T(T<=10), indicating the number of test cases.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
Output
For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.
Sample Input
2 3 2 1 2 10 3 1 15 1 2 2 3 2 2 1 2 100 1 2 2 1
Sample Output
10 25 100 100
这里才用的是单源最短路径,注意在不能到达的时候,输出是0!
#include <iostream>
#include <queue>
using namespace std;
const int size=40001;
const int maxs=2000000000;
struct node
{
int a;
int b;
int dis;
node *next;
};
unsigned int dis[size];
node *mynode[size]={0};
bool visited[size]={0};
int start,end;
int main()
{
for (int j=0;j<size;++j)
{
mynode[j]=NULL;
dis[j]=maxs;
visited[j]=0;
}
queue<node*> q;
int T,n,m,a,b,c;
cin>>T;
while (T>0)
{
cin>>n>>m;
while (n-1>0)
{
cin>>a>>b>>c;
node *na=new node;
node *nb=new node;
na->a=nb->b=a;
na->b=nb->a=b;
na->dis=nb->dis=c;
if (mynode[a]==NULL)
{
mynode[a]=na;
na->next=NULL;
}
else
{
na->next=mynode[a];
mynode[a]=na;
}
if (mynode[b]==NULL)
{
mynode[b]=nb;
nb->next=NULL;
}
else
{
nb->next=mynode[b];
mynode[b]=nb;
}
--n;
}
while (m>0)
{
int sum=-1;
node *temp;
cin>>a>>b;
start=a;
end=b;
dis[start]=0;
temp=mynode[a];
while (temp!=NULL)
{
dis[temp->b]=temp->dis;
q.push(temp);
visited[temp->a]=visited[temp->b]=1;
temp=temp->next;
}
while (!q.empty())
{
temp=q.front();
q.pop();
temp=mynode[temp->b];
while (temp!=NULL)
{
if (!visited[temp->b])
{
q.push(temp);
visited[temp->b]=1;
}
if (dis[temp->b]>dis[temp->a]+temp->dis)
dis[temp->b]=dis[temp->a]+temp->dis;
temp=temp->next;
}
}
if (dis[end]==maxs)
cout<<0<<endl;
else cout<<dis[end]<<endl;
--m;
for (int j=0;j<size;++j)
{
dis[j]=maxs;
visited[j]=0;
}
}
for (int j=0;j<size;++j)
{
node* temp;
while (mynode[j]!=NULL)
{
temp=mynode[j];
mynode[j]=mynode[j]->next;
delete temp;
}
}
--T;
}
return 0;
}