先试了试Floyd算法,结果没弄出来。然后试了试单源Dijsktra最短路径,两层循环找出最小的结果,建图的过程中遇到了小麻烦,有时间的话再写一写Floyd算法。
CODE:
#include <cstdio>
#include <cstdlib>
#include <string>
using namespace std;
const int SIZE = 1010;
const int INF = 0x3fffffff;
int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
int T, S, D, tot;
int link[SIZE], want[SIZE];
int max(int x, int y)
{
return x > y ? x : y;
}
void Dijkstra(int src, int n)
{
int i, j;
memset(v, 0, sizeof(v));
for(i = 1; i <= n; i++) d[i] = (i == src)? 0 : INF;
for(i = 1; i <= n; i++)
{
int x, m = INF;
for(int y = 1; y <= n; y++) if(!v[y] && m >= d[y]) m = d[x=y];
v[x] = 1;
for(int y = 1; y <= n; y++) d[y] <?= d[x]+w[x][y];
}
}
void init()
{
for(int i = 1; i <= SIZE; i++)
{
for(int j = 1; j <= SIZE; j++)
{
w[i][j] = w[j][i] = INF;
}
}
memset(d, 0, sizeof(d));
memset(link, 0, sizeof(link));
memset(want, 0, sizeof(want));
}
int main()
{
int i, j;
while(~scanf("%d%d%d", &T, &S, &D))
{
init();
tot = 0;
for(i = 1; i <= T; i++)
{
int u, v, w1;
scanf("%d%d%d", &u, &v, &w1);
if(w1 < w[u][v]) //判重边,不加这句话WA了N次。
{
w[u][v] = w[v][u] = w1;
}
tot >?= max(u, v);
}
for(i = 1; i <= S; i++) scanf("%d", &link[i]);
for(i = 1; i <= D; i++) scanf("%d", &want[i]);
int ans = INF, min;
for(i = 1; i <= S; i++)
{
Dijkstra(link[i], tot);
min = INF;
for(j = 1; j <= D; j++)
{
min <?= d[want[j]];
}
ans <?= min;
}
printf("%d\n", ans);
}
return 0;
}
#include <cstdlib>
#include <string>
using namespace std;
const int SIZE = 1010;
const int INF = 0x3fffffff;
int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
int T, S, D, tot;
int link[SIZE], want[SIZE];
int max(int x, int y)
{
return x > y ? x : y;
}
void Dijkstra(int src, int n)
{
int i, j;
memset(v, 0, sizeof(v));
for(i = 1; i <= n; i++) d[i] = (i == src)? 0 : INF;
for(i = 1; i <= n; i++)
{
int x, m = INF;
for(int y = 1; y <= n; y++) if(!v[y] && m >= d[y]) m = d[x=y];
v[x] = 1;
for(int y = 1; y <= n; y++) d[y] <?= d[x]+w[x][y];
}
}
void init()
{
for(int i = 1; i <= SIZE; i++)
{
for(int j = 1; j <= SIZE; j++)
{
w[i][j] = w[j][i] = INF;
}
}
memset(d, 0, sizeof(d));
memset(link, 0, sizeof(link));
memset(want, 0, sizeof(want));
}
int main()
{
int i, j;
while(~scanf("%d%d%d", &T, &S, &D))
{
init();
tot = 0;
for(i = 1; i <= T; i++)
{
int u, v, w1;
scanf("%d%d%d", &u, &v, &w1);
if(w1 < w[u][v]) //判重边,不加这句话WA了N次。
{
w[u][v] = w[v][u] = w1;
}
tot >?= max(u, v);
}
for(i = 1; i <= S; i++) scanf("%d", &link[i]);
for(i = 1; i <= D; i++) scanf("%d", &want[i]);
int ans = INF, min;
for(i = 1; i <= S; i++)
{
Dijkstra(link[i], tot);
min = INF;
for(j = 1; j <= D; j++)
{
min <?= d[want[j]];
}
ans <?= min;
}
printf("%d\n", ans);
}
return 0;
}