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; }
浙公网安备 33010602011771号