#include <stdio.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1<<27; //100000027
const int N = 1002;
int maxx, minn;
bool start[N], endd[N];
int path[N][N];
int floyd()
{
int i, j, k;
for(k = 1; k <= maxx; k++)
{
for(i = 1; i <= maxx; i++)
{
if(path[i][k] != INF)
{
for(j = 1; j <= maxx; j++)
{
if(path[i][j] > path[i][k] + path[k][j])
path[i][j] = path[i][k] + path[k][j];
if(start[i] && endd[j] && minn > path[i][j])
minn = path[i][j];
}
}
}
}
return minn;
}
int main()
{
int i, j, a, b, time, T, S, D, link, love;
while(~scanf("%d%d%d", &T, &S, &D))
{
maxx = 0; minn = INF;
for(i = 1; i <= 1000; i++)
for(j = 1; j <= 1000; j++)
path[i][j] = INF;
for(i = 1; i <= T; i++)
{
scanf("%d%d%d", &a, &b, &time);
maxx = maxx < a? a :maxx;
maxx = maxx < b? b :maxx;
path[a][b] = path[b][a] = path[a][b] > time ? time : path[a][b];
}
memset(start, false, sizeof(start));
memset(endd, false, sizeof(endd));
for(i = 1; i <= S; i++)
{
scanf("%d", &link);
start[link] = true;
}
for(i = 1; i <= D; i++)
{
scanf("%d", &love);
endd[love] = true;
}
printf("%d\n", floyd());
}
return 0;
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1<<27; //100000027
const int N = 1002;
int maxx, minn;
bool start[N], endd[N];
int path[N][N];
int floyd()
{
int i, j, k;
for(k = 1; k <= maxx; k++)
{
for(i = 1; i <= maxx; i++)
{
if(path[i][k] != INF)
{
for(j = 1; j <= maxx; j++)
{
if(path[i][j] > path[i][k] + path[k][j])
path[i][j] = path[i][k] + path[k][j];
if(start[i] && endd[j] && minn > path[i][j])
minn = path[i][j];
}
}
}
}
return minn;
}
int main()
{
int i, j, a, b, time, T, S, D, link, love;
while(~scanf("%d%d%d", &T, &S, &D))
{
maxx = 0; minn = INF;
for(i = 1; i <= 1000; i++)
for(j = 1; j <= 1000; j++)
path[i][j] = INF;
for(i = 1; i <= T; i++)
{
scanf("%d%d%d", &a, &b, &time);
maxx = maxx < a? a :maxx;
maxx = maxx < b? b :maxx;
path[a][b] = path[b][a] = path[a][b] > time ? time : path[a][b];
}
memset(start, false, sizeof(start));
memset(endd, false, sizeof(endd));
for(i = 1; i <= S; i++)
{
scanf("%d", &link);
start[link] = true;
}
for(i = 1; i <= D; i++)
{
scanf("%d", &love);
endd[love] = true;
}
printf("%d\n", floyd());
}
return 0;
}
心得:想练练floyd,有点不解为什么下标不能等于0.
答:题目中给出范围,怪自己看题不认真= =