LightOJ 1019 Brush (V)

http://lightoj.com/volume_showproblem.php?problem=1019

裸的dij,注意两点之间有多条边,因为这个WA了一次。

#include<cstdio>

#include<cstring>

#include<cstdlib>

#include<queue>

#include<algorithm>

using namespace std;



const int MAXN = 1 << 7;

int d[MAXN], g[MAXN][MAXN];

const int inf = 0x3f3f3f3f;

int n, m;

typedef pair<int , int> pii;



void ReadGraph()

{

    scanf( "%d%d", &n, &m);

    for( int i = 1; i <= n; i ++)

        for( int j = 1; j <= n; j ++)

        {

            if( i != j)

                g[i][j] = inf;

            else

                g[i][j] = 0;

        }

    while( m --)

    {

        int u, v, w;

        scanf( "%d%d%d", &u, &v, &w);

        if( g[u][v] > w )

            g[u][v] = g[v][u] = w;

    }

}



void Dijkstra()

{

    priority_queue< pii, vector<pii>, greater<pii> > q;

    for( int i = 2; i <= n; i ++)

        d[i] = inf;

    d[1] = 0;

    q.push( make_pair(d[1], 1 ));

    while( !q.empty())

    {

        pii u = q.top();

        q.pop();

        int x = u.second;

        if( u.first != d[x]) continue;

        for( int i = 1; i <= n; i ++)

        {

            if(  d[i] > d[x] + g[x][i])

            {

                d[i] = d[x] + g[x][i];

                q.push( make_pair( d[i], i));

            }

        }

    }

}



int main()

{

    int T, cas;

    scanf( "%d", &T);

    for( cas = 1; cas <= T; cas ++)

    {

        ReadGraph();

        printf( "Case %d: ", cas);

        Dijkstra();

        if( d[n] == inf)

            printf( "Impossible\n");

        else

            printf( "%d\n", d[n]);

    }

    return 0;

}

 

 

你可能感兴趣的:(sh)