谁能帮我编一下这题?Pascal

来源:百度知道 编辑:UC知道 时间:2024/06/24 10:40:00
旅游路线(jou)
输入文件名 jou.in
输出文件名 jou.out

在Byteland有n个城市(编号从1到n),它们之间通过n – 1条双向的道路相连,从任意城市都可以走到其他的任何城市。
一天,starhder到了编号为k的城市。他计划从城市k开始,游遍城市m1,m2,m3……,mj(不一定要按这个顺序旅游)。每个城市mi都是不同的,并且,也与k不同。 Starhder —— 就像每一个旅行家一样,携带的钱总是有限的,所以,他要以最短的路程旅行完所有的城市(从城市k开始)。
于是,他请你帮助计算一下,旅游完上述的城市最短的路程是多少?

输入
第一行包含两个整数,上文中的n和k,以一个空格隔开。(2<= n <=50000,1 <= k <=n)
下面的n – 1行每行描述一条路,第i + 1行包含3个整数ai,bi,di,相邻两个数用一个空格隔开(1<= ai,bi <= n,1<= di <= 1000),ai和bi是用道路直接相连的城市编号,di是这条道路的长度。
第n + 1行包含一个整数j,是starhder要旅游的城市数(1<= j <= n - 1),接下来一行包含j个不同的整数m1,m2,……,mj,每两个相邻的整数用一个空格隔开,表示starhder想要去的城市。(1<= mt<=n,mt <> k)。

输出
输出只有一行,包含一个整数:starhder旅游的最短路程。

样例
jou.in
4 2
1 2 1
4 2 2
2 3 3
2
1 3

jou.out
5

谢谢啊~~~~~~~~~~~~~~~~~~~

推荐lz学C++吧,好多既省时间又省空间的数据结构C++里俯拾即是,用pascal还得下很大力气去写
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int> G[50025],E[50025];
int father[50025],len[50025],go[50025],D[50025];
bool f[50025];
int n,m,k;
void init()
{
for (int i=1;i<=n;i++) G[i].clear();
for (int i=1;i<=n;i++) E[i].clear();
memset(father,0,sizeof(father));
memset(len,0,sizeof(len));
memset(f,0,sizeof(f));
memset(D,0,sizeof(D));
f[k]=true;
}
void getfather(int v)
{
for (int i=0;i<G[v].size();i++)
{
int u=G[v][i];
if (u!=father[v])
{
father[u]=v;
len[u]=E[v][i];
getfather(u);
}
}
}
void getdis(int v)
{
if (D[v]) return;
if (v==k) return;
int u=father[v];
getdis(u);
D[v]=len[v]+D[u];
}
int main()
{
freopen("jou.in&q