您的位置:首页 > 其它

POJ 2387 解题报告

2014-12-14 12:32 176 查看
又写了个n^2的dijkstra,heap的dijkstra想想还是太复杂了。

2387Accepted216K94MSC++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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: