さいたんらく
2372 ワード
テーマURL:最短
この問題はfloydアルゴリズムを用いていたが,ここでは別のDijstraアルゴリズムを紹介する.
Dijstraアルゴリズムフロー:
(1)初期化,集合kはノード1に加え,ノード1から自分への最短経路は0,他のノードへはINFである.
(2)集合kノードに直接接続された辺(u,v,c)を遍歴し、ここでuは集合kに属し、vはkに属さず、ノード1から得られた最短路でuに到達し、さらにuからその辺を通ってvに到達する経路長を計算する.集合kにおけるノードに直接接続されていないすべての非集合kのノードの経路長を比較し、経路長が最も小さいノードは、次の最短経路で決定されたノードを決定し、その最短経路はこの経路長であり、最後にこのノードを集合kに加える.
(3)集合kにすべてのノードが含まれている場合,終了し,そうでなければ回転する(2).
この問題はfloydアルゴリズムを用いていたが,ここでは別のDijstraアルゴリズムを紹介する.
Dijstraアルゴリズムフロー:
(1)初期化,集合kはノード1に加え,ノード1から自分への最短経路は0,他のノードへはINFである.
(2)集合kノードに直接接続された辺(u,v,c)を遍歴し、ここでuは集合kに属し、vはkに属さず、ノード1から得られた最短路でuに到達し、さらにuからその辺を通ってvに到達する経路長を計算する.集合kにおけるノードに直接接続されていないすべての非集合kのノードの経路長を比較し、経路長が最も小さいノードは、次の最短経路で決定されたノードを決定し、その最短経路はこの経路長であり、最後にこのノードを集合kに加える.
(3)集合kにすべてのノードが含まれている場合,終了し,そうでなければ回転する(2).
#include
#include
#include
using namespace std;
struct e{//
int next;//
int cost;// ( )
};
const int INF = 123123123;
vector edge[101];//
bool mark[101];// , mark[i] true i , k
int dist[101];// , mark[i] true ,dist[i] , 1 , k ,
// i
int main()
{
int n, m;
while (cin >> n >> m&&n&&m)
{
for (int i = 1; i <= n; i++)
{//
edge[i].clear();
mark[i] = false;
dist[i] = INF;// dist[i] -1,
}
while (m--)
{
int a, b, c;
cin >> a >> b >> c;
e tmp;
tmp.next = b;
tmp.cost = c;
edge[a].push_back(tmp);
tmp.next = a;// ,
edge[b].push_back(tmp);
}
dist[1] = 0;
mark[1] = true;
int newp = 1;
for (int i = 1; i < n; i++)
{
for (int j = 0; j < edge[newp].size(); j++)
{
int t = edge[newp][j].next;
int c = edge[newp][j].cost;
if (mark[t])
continue;// k,
if (dist[t]>dist[newp] + c)//if(dist[t]==-1||dist[t]>dist[newp]+c)
{// ,
dist[t] = dist[newp] + c;//
}
}
int min = 123123123;
for (int j = 1; j <= n; j++)
{// , k , k , mark true
if (mark[j])
continue;
/*
if(dist[j]==-1)
continue;
*/
if (dist[j] < min)
{
min = dist[j];
newp = j;
}
}
mark[newp] = true;
}
cout << dist[n] << endl;
}
return 0;
}
/**************************************************************
Problem: 1447
User: hellosyqq
Language: C++
Result: Accepted
Time:30 ms
Memory:1520 kb
****************************************************************/