给定n个点m条边,求从1到n的最短路径。
一开始用dijkstra算法,莫名其妙的WA,然后改成spfa做,还是WA,最后改成floyed算法,一次就过。这无语的。Spfa的代码保留着,若有大神看到,求指点。
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std ;
const int inf = 1 << 20 ;
int n , m ;
int dis[105][105] ;
int node[105] = {0} ;
bool had[105] = {0} ;
queue <int> q ;
void init() {
for (int i = 1 ; i <= n ; i ++) {
for (int j = 1 ; j <= n ; j++) {
dis[i][j] = inf ;
}
}
memset(had , 0 , sizeof(had)) ;
node[1] = 0 ; had[1] = 1 ;
for (int i = 2 ; i <= n ; i ++) {
node[i] = inf ;
}
}
/*
void spfa() {
while (!q.empty()) {
int t = q.front() ; q.pop() ;
for (int i = 1 ; i <= n ; i ++) {
if (node[t] + dis[t][i] < node[i]) {
node[i] = node[t] + dis[t][i] ;
if (!had[i]) {
had[i] = 1 ;
q.push(i) ;
}
}
}
}
}
*/
void floyed() {
for (int k = 1 ; k <= n ; k ++) {
for (int i = 1 ; i <= n ; i ++) {
for (int j = 1; j <= n ; j ++) {
if (i!=k && i!=j && j!=k && dis[i][k]+dis[k][j]<dis[i][j]) {
dis[i][j] = dis[i][k] + dis[k][j] ;
}
}
}
}
}
int main() {
//freopen("in.txt" , "r" , stdin) ;
while (cin >> n >> m) {
if (!n && !m) break ;
init() ;
while (m --) {
int a , b , c ;
cin >> a >> b >> c ;
if (c < dis [a][b]) dis[a][b] = dis[b][a] = c ;
}
q.push(1) ;
floyed() ;
cout << dis[1][n] << endl ;
}
return 0 ;
}