又写了个n^2的dijkstra,heap的dijkstra想想还是太复杂了。
2387 | Accepted | 216K | 94MS | C++ | 1549B |
/*
ID: thestor1
LANG: C++
TASK: poj2387
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>
using namespace std;
class Edge
{
public:
int v, w;
Edge() {}
Edge(int v, int w) : v(v), w(w) {}
};
int dijkstra(int source, int sink, vector<vector<Edge> > &adjs)
{
int N = adjs.size();
std::vector<int> dis(N, INT_MAX);
std::vector<bool> visited(N, false);
dis[source] = 0;
for (int i = 0; i < N; ++i)
{
int mindis = INT_MAX, minu = -1;
for (int u = 0; u < N; ++u)
{
if (!visited[u] && dis[u] < mindis)
{
mindis = dis[u];
minu = u;
}
}
if (mindis == INT_MAX || minu == sink)
{
break;
}
// cout << "minu: " << minu << ", mindis: " << mindis << endl;
visited[minu] = true;
for (int j = 0; j < adjs[minu].size(); ++j)
{
if (mindis + adjs[minu][j].w < dis[adjs[minu][j].v])
{
dis[adjs[minu][j].v] = mindis + adjs[minu][j].w;
}
}
}
return dis[sink];
}
int main()
{
int T, N;
scanf("%d%d", &T, &N);
vector<vector<Edge> > adjs(N, vector<Edge>());
for (int i = 0; i < T; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
u--, v--;
adjs[u].push_back(Edge(v, w));
adjs[v].push_back(Edge(u, w));
}
printf("%d\n", dijkstra(N - 1, 0, adjs));
return 0;
}