您的位置:首页 > 其它

最短路径--九度1008.[Dijkstra]

2017-02-28 10:26 253 查看
题目:http://ac.jobdu.com/problem.php?pid=1008

本题要求是要在最短路径长度相同的情况下,选择花费小的方案,但其实是没有这样的测试点的;九度还是有点弱哪!!

【纠结】:为什么在选最小边时不用考虑花费因素呢?

#include<cstdio>
#define maxSize 100000000
using namespace std;

int edges[1010][1010]; //边长
int cost[1010][1010]; //表示花费
int visit[1010];  //表示是否已访问
int dist[1010];  //表示当前已经找到的从V0到Vi的最短路径长度
int minCost[1010]; //表示最小花费

int main() {
int n, m, a, b,d, p, s, t;
while (scanf("%d%d", &n, &m) != EOF) {
if (0 == n && 0 == m) break;//退出

for (int i = 1; i <= n; i++) {//初始化边长、花费
for (int j = 1; j <= n; j++) {
edges[i][j] = maxSize;
cost[i][j] = maxSize;
}
}

for (int i = 0; i < m; i++) {//输入
scanf("%d%d%d%d", &a, &b, &d, &p);
edges[a][b] = edges[b][a] = d;
cost[a][b] = cost[b][a] = p;
}
scanf("%d%d", &s, &t);//输入起点&终点

for (int i = 1; i <= n; i++) {//初始化
dist[i] = edges[s][i];
minCost[i] = cost[s][i];
visit[i] = 0;
}

visit[s] = 1;//加入起点

for (int k = 2; k <= n; k++) {

int min = maxSize, key = s;
for (int i = 1; i <= n; i++) {
//选最小边时不用考虑花费因素,因为距离最近的点的花费已经不可能由于经过其他点而发生改变了
if (visit[i] == 0 && min > dist[i]) {

min = dist[i];
key = i;

}//if
}//for - i
visit[key] = 1;//加入出发点

for (int j = 1; j <= n; j++) {//更新
if (visit[j] == 0 &&
(dist[key] + edges[key][j] < dist[j]
|| (dist[key] + edges[key][j] == dist[j] && minCost[key] + cost[key][j] < minCost[j])
) //距离相同时,选花费小的
) {
dist[j] = dist[key] + edges[key][j];
minCost[j] = minCost[key] + cost[key][j];
}
}

}
printf("%d %d\n", dist[t], minCost[t]);
}//while
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: