POJ2387

来源:互联网 发布:淘宝股东持股比例 编辑:程序博客网 时间:2024/06/04 19:44

好好一道Dijkstra模板题,瞎敲了一种方法

复杂度O(nlogn),排序*点数

原本一直wa,经大佬点播要多次排序

深夜扭出一组数据,发现不排序会错:节点2未连接

5 10
1 10 4
2 4 8
4 6 2
6 2 1
4 10 3

以后还是用模板的写法吧。。大佬说图论不要瞎敲

思路如下:2层循环,i指过的地方表示最短路已建立,j以i为中继点向后移动进行松弛

这里就要求i指的一定是到源点最短的一个点,所以每次变动i都要再对数组进行排序

代码如下:

#define inf 0x3f3f3f3f#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;struct spot {int id;int d;};int cmp(spot a, spot b) {return a.d < b.d;}int chart[1001][1001];//chart[i][j]:i到j的距离spot dis[1001];//dis[i]:i到1的距离int ans[1001];int main() {int t, n;while (~scanf("%d %d", &t, &n)) {memset(chart, 0, sizeof(chart));for (int i = 1; i <= n; i++) {dis[i].d = inf;dis[i].id = i;}dis[1].d = 0;for (int i = 1; i <= t; i++) {int x, y, z;scanf("%d %d %d", &x, &y, &z);if (chart[x][y] && chart[x][y] <= z) {continue;}chart[x][y] = chart[y][x] = z;if (x == 1) { dis[y].d = z; } else if (y == 1) { dis[x].d = z; }}sort(dis+1, dis + n +1,cmp);for (int i = 1; i <= n; i++) {//if (dis[i].id == n) {//cout << dis[i].id << "_________" << dis[i].d << endl;//}}//cout << endl;for (int i = 2; i <= n; i++) {//cmp[i].d存储i到1的最短距离sort(dis + 1, dis + n + 1, cmp);int sure = dis[i].id;for (int j = i ; j <= n; j++) {int temp = dis[j].id;if (chart[sure][temp]) {dis[j].d = min(dis[j].d, dis[i].d + chart[temp][sure]);//cout << dis[j].id << "___________" << dis[j].d << endl;//cout << "link  " << sure << "  to " << temp << endl;}}}//cout << endl;for (int i = 1; i <= n; i++) {if (dis[i].id == n) {//cout <<dis[i].id<<"_________"<<dis[i].d << endl;cout << dis[i].d;}}}}

0 0
原创粉丝点击