超时代码:
#include <cstring>
#include <cstdio>
#define max 1010
#define INF 0xfffffff
int dist[max][max],t,s,d;
bool mark1[max],mark2[max]; // 标记邻近家的点和想去的点。
int Floyd (int n)
{
int tmp = INF;
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (dist[i][j] > dist[i][k]+dist[k][j])
dist[i][j] = dist[i][k]+dist[k][j];
if (mark1[i] && mark2[j])
tmp = tmp < dist[i][j] ? tmp : dist[i][j];
}
return tmp;
}
void init ()
{
for (int i=0;i<1005;i++)
for (int j=i+1;j<1006;j++)
dist[i][j] = dist[j][i] = INF;
}
int main ()
{
while (~scanf ("%d%d%d",&t,&s,&d))
{
int a,b,c,max_city=0;
init (); //任何两点之间的距离初始化为无穷大。
while (t--)
{
scanf ("%d%d%d",&a,&b,&c);
if (dist[a][b] > c)
dist[a][b] = dist[b][a] = c;
max_city = (a>b?a:b) > max_city ? (a>b?a:b):max_city;
}
int tmp;
memset (mark1,0,sizeof (mark1)); //标记数组初始化 假。
memset (mark2,0,sizeof (mark2));
for (int i=0;i<s;i++)
{
scanf ("%d",&tmp);
mark1[tmp] = true;
}
for (int i=0;i<d;i++)
{
scanf ("%d",&tmp);
mark2[tmp] = true;
}
int ans = Floyd (max_city);
printf ("%d\n",ans);
}
return 0;
}
AC代码:
#include <cstring>
#include <cstdio>
#define max 1010
#define INF 0xfffffff
int dist[max][max],t,s,d;
bool mark1[max],mark2[max]; // 标记邻近家的点和想去的点。
int Floyd (int n)
{
int tmp = INF;
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
{
if (dist[i][k] != INF)
for (int j=1;j<=n;j++)
{
if (dist[i][j] > dist[i][k]+dist[k][j])
dist[i][j] = dist[i][k]+dist[k][j];
if (mark1[i] && mark2[j])
tmp = tmp < dist[i][j] ? tmp : dist[i][j];
}
}
return tmp;
}
void init ()
{
for (int i=0;i<1005;i++)
for (int j=i+1;j<1006;j++)
dist[i][j] = dist[j][i] = INF;
}
int main ()
{
while (~scanf ("%d%d%d",&t,&s,&d))
{
int a,b,c,max_city=0;
init (); //任何两点之间的距离初始化为无穷大。
while (t--)
{
scanf ("%d%d%d",&a,&b,&c);
if (dist[a][b] > c)
dist[a][b] = dist[b][a] = c;
max_city = (a>b?a:b) > max_city ? (a>b?a:b):max_city;
}
int tmp;
memset (mark1,0,sizeof (mark1)); //标记数组初始化 假。
memset (mark2,0,sizeof (mark2));
for (int i=0;i<s;i++)
{
scanf ("%d",&tmp);
mark1[tmp] = true;
}
for (int i=0;i<d;i++)
{
scanf ("%d",&tmp);
mark2[tmp] = true;
}
int ans = Floyd (max_city);
printf ("%d\n",ans);
}
return 0;
}