/*
很简单的模版题...Dijkstra应该就不用多说了...算法比较简单...尤其是数据结构中的...所以流程图都有...大家一搜一大堆我就不赘述了...赘述也是多余
给几组数据
3 3
1 2 1
1 3 3
2 3 1
3 1
1 2 1
6 9
1 2 7
1 3 9
1 4 14
2 3 10
2 5 15
3 4 2
3 5 11
4 6 9
5 6 6
6 8
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
****************************************************
2
-1
20
60*/
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3fffffff;
const int V = 200;
int dijkstra(int map[][V],int start,int end,int n) //map为临界矩阵,n为矩阵大小
{
int final[V],track[V],i,j,ant=n*n;
memset(track,0,sizeof(track));
for(i=1;i<=n;i++)
final[i]=map[start][i]!=0?map[start][i]:INF;
track[start]=1;
while(ant--)
{
int judge=1,min=INF,getmin=start;
for(i=1;i<=n;i++)
judge*=track[i];
if(judge) return final[end];
for(i=1;i<=n;i++)
{
if( final[i] < min && final[i]!=INF && track[i]==0)
{
getmin = i;
min = final[i];
}
final[i] = final[start]+(map[start][i]==0?INF:map[start][i]) < final[i] ? final[start]+(map[start][i]==0?INF:map[start][i]) : final[i];
}
track[getmin]=1;
start = getmin;
}
return -1;
}
int main()
{
// freopen("in.txt","r",stdin);
int i,j,n,m,map[V][V];
while(cin>>n>>m && (n!=0 || m!=0))
{
memset(map,0,sizeof(map));
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
if(map[a][b]!=0)
{
map[a][b] = c<map[a][b]?c:map[a][b];
map[b][a] = map[a][b];
}else
{
map[b][a]=c;
map[a][b]=c;
}
}
//int start,end;
//cin>>start>>end;
cout<<dijkstra(map,1,n,n)<<endl;
}
return 0;
}
HDU 2544 最短路 Dijkstra
最新推荐文章于 2021-08-17 17:56:31 发布