又做了一遍这道题目,这次是用spfa方法做的,这个方法是用来处理含有负权问题的,用队列来维护,复杂度也降低了不少,有点不好理解,。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
#include<queue>
#define MAX 0x7fffffff
using namespace std;
int gra[105][105];
int main()
{
int n,m,i,j,a,b,c;
bool visit[105];
vector<int>v[105];
int d[105];
while(cin >> n >> m, n||m)
{
for(i=1; i<=n; i++)
visit[i] = false;
for(i=1; i<=n; i++)
v[i].clear();
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(i == j)
gra[i][j] = 0;
else
gra[i][j] = MAX;
for(i=1; i<=m; i++)
{
cin >> a >> b >> c;
gra[a][b] = gra[b][a] = c;
v[a].push_back(b);//用vector建立邻接表
v[b].push_back(a);
}
queue<int>q;
for(i=1; i<=n; i++)
{
d[i] = MAX;
}
d[1] = 0;
q.push(1);
visit[1] = true;
while(!q.empty())
{
int y = q.front();
q.pop();
visit[y] = false;
for(i=0; i<v[y].size(); i++)//更新它邻接的点,注意这里更新的时候gra[i][j]不会是无穷大,因为邻接的点都有权值了。。。
{
if(d[v[y][i]] > d[y] + gra[y][v[y][i]])
{
d[v[y][i]] = d[y] + gra[y][v[y][i]];
if(!visit[v[y][i]])// 如果该点已经在队列中了,就不加进去
{
q.push(v[y][i]);
visit[v[y][i]] = true;
}
}
}
}
cout << d[n] << endl;
}
return 0;
}