链接:http://poj.org/problem?id=2387
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 46509 | Accepted: 15814 |
Description
Input
Output
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
Hint
INPUT DETAILS:题意:1 -- n个点,求1--t的最短距离
dijkstra,单源最短路
优化代码:
#define _CRT_SBCURE_MO_DEPRECATE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn =2000 + 10;
const int INF =0x3f3f3f3f;
struct node {
int v, len;
node(int v = 0, int len = 0) :v(v), len(len) {}
bool operator < (const node &a)const { //距离从小到大排序
return len > a.len;
}
};
vectorG[maxn];
int dis[maxn];
bool vis[maxn];
int n, t;
void init() {
for (int i = 0; iQ;
Q.push(node(s, 0));//加入队列并排序
dis[s] = 0;
while (!Q.empty()) {
node now = Q.top(); //取出当前最小的
Q.pop();
int v = now.v;
if (vis[v]) continue; //如果标记过了 直接continue
vis[v] = true;
for (int i = 0; i dis[v] + len) {
dis[v2] = dis[v] + len;
Q.push(node(v2, dis[v2]));
}
}
}
printf("%d\n", dis[e]);
}
int main()
{
while (scanf("%d %d", &n, &t) != EOF) {
init();
for (int i = 1; i <= n; i++) {
int a, b, len;
scanf("%d %d %d", &a, &b, &len);
G[a].push_back(node(b, len));
G[b].push_back(node(a, len));
}
dijkstra_heap(1, t);
}
system("pause");
return 0;
}
为优化版:
错了很多次,因为n和t弄反了,,,用链表不需要判重边
#define _CRT_SBCURE_MO_DEPRECATE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 2000 + 10;
const int INF = 0x3f3f3f3f;
struct node {
int vex;
int weight;
node(int a, int b) :vex(a), weight(b) {}
};
int n, t;
int mindist[maxn];
bool intree[maxn];
vectorG[maxn];
int m[maxn][maxn];
void init() {
for (int i = 0; i < maxn; i++) {
intree[i] = false;
G[i].clear();
mindist[i] = INF;
}
}
void Dijkstra(int s) {
int ans = 0;
int vex, addNode, tempMin;
intree[s] = true;
mindist[s] = 0;
for (int i = 0; i < G[s].size(); i++) {
vex = G[s][i].vex;
if (mindist[vex] > G[s][i].weight)
mindist[vex] = G[s][i].weight;
}
for (int nodeNum = 1; nodeNum <= n; nodeNum++) {
tempMin = INF;
for (int i = 1; i <= n; i++) {
if (intree[i] == false && mindist[i] < tempMin) {
tempMin = mindist[i];
addNode = i;
}
}
intree[addNode] = true;
for (int i = 0; i < G[addNode].size(); i++) {
vex = G[addNode][i].vex;
if (intree[vex] == false && mindist[addNode] + G[addNode][i].weight < mindist[vex])
mindist[vex] = mindist[addNode] + G[addNode][i].weight;
}
}
printf("%d\n", mindist[n]);
}
int main()
{
while (scanf("%d %d", &t, &n) != EOF) {
init();
for (int i = 1; i <= t; i++) {
int a, b, len;
scanf("%d %d %d", &a, &b, &len);
G[a].push_back(node(b, len));
G[b].push_back(node(a, len));
}
Dijkstra(1);
}
return 0;
}