题目意思很好懂,解题思路就是 最短路径 法 。
#include <iostream>
#include<cstdio>
#include<cmath>
#include<climits>
using namespace std;
const int N= 1001;
int e[N][N],S[N],D[N];
int t,s,d;
int main()
{
int i,j,k;
int t1,t2,t3,ans;
int Min;
while(cin>>t>>s>>d)
{
ans=0;
Min=INT_MAX;
for(i=1; i<N; i++)
{
for(j=1; j<N; j++)
{
e[i][j]=INT_MAX;
}
}
for(i=1; i<=t; i++)
{
cin>>t1>>t2>>t3;
if(t1>ans)
ans=t1;
if(t2>ans)
ans=t2;
if(e[t1][t2]>t3)
e[t1][t2]=e[t2][t1]=t3;
}
for(i=0; i<s; i++)
cin>>S[i];
for(i=0; i<d; i++)
cin>>D[i];
for(k=1; k<=ans; k++)
{
for(i=1; i<=ans; i++)
{
if(e[i][k]==INT_MAX)
continue;
for(j=1; j<=ans; j++)
{
if(e[i][k]<INT_MAX&&e[k][j]<INT_MAX&&e[i][j]>e[i][k]+e[k][j])
{
e[i][j]=e[i][k]+e[k][j];
}
}
}
}
for(i=0; i<s; i++)
{
for(j=0; j<d; j++)
{
if(e[S[i]][D[j]]<Min)
Min=e[S[i]][D[j]];
}
}
printf("%d\n",Min);
}
return 0;
}
TLE 了 一上午, 通过无数次的提交测试。终于发现了不能用 scanf 用 scanf 会超时 ,去问了一下大神们,也没说什么。做一个教训吧。
不对重点不是这个,应该是这个最短路径法的 算法 ,给个链接,个人觉得写的很通俗易懂,很好。