先试了试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, 0sizeof(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, 0sizeof(d));
    memset(link, 0sizeof(link));
    memset(want, 0sizeof(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;

 

posted on 2012-08-26 19:45  有间博客  阅读(248)  评论(0编辑  收藏  举报