-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1028.cpp
More file actions
86 lines (82 loc) · 1.44 KB
/
Copy path1028.cpp
File metadata and controls
86 lines (82 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//迪杰斯特拉算法
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int m, n,E,s,t; //m组测试数据,顶点数、边数、顶点s以及顶点t.
int edge[501][501];
int dis[501];
int sel[501];//表示这个点是否被访问过
int flag=1;//记录当前是不是所有点都被访问过了
void dijkstra()
{
int minPoint = s;
for (int i = 1; i <= n; i++)
{
dis[i] = edge[minPoint][i];
}
while (1)
{
int minEdge = 0x3f3f3f3f;
flag = 1;
for (int i = 1; i <= n; i++)
{
if (dis[i] < minEdge&&sel[i]==0)//找到最小的
{
minEdge = dis[i];
minPoint = i;
flag = 0;
}
}
if (flag == 1)//当所有点都被选择过
{
break;
}
sel[minPoint] = 1;//这个点被访问过了
for (int i = 1; i <= n; i++)//更新dis数组
{
dis[i] = min(dis[i], minEdge + edge[minPoint][i]);
}
}
}
int main() {
cin >> m;
while (m--)
{
cin >> n;//顶点数、边数、顶点s以及顶点t.
cin >> E;
cin >> s;
cin >> t;
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
edge[i][j] = 0x3f3f3f3f;//初始化为无穷大
}
edge[i][i] = 0;
}
for (int i = 0; i <= n; i++)
{
sel[i] = 0;//未被访问
}
sel[s] = 1;//起点被访问
int u1, v1, w1;
for (int i = 0; i <E; i++) {//输入无向边的信息
cin >> u1;
cin >> v1;
cin >> w1;
edge[u1][v1] = min(edge[u1][v1], w1);
edge[v1][u1] = edge[u1][v1];//无向边
}
dijkstra();
if (dis[t] < 0x3f3f3f3f)
{
cout << dis[t] << endl;
}
else
{
cout << -1 << endl;
}
}
return 0;
}