IT民工
加油!

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;
}

 

 

posted on 2012-07-28 17:05  找回失去的  阅读(231)  评论(0)    收藏  举报