hdu-2066一人旅---テンプレートの問題
8363 ワード
テーマリンク:
http://acm.hdu.edu.cn/showproblem.php?pid=2066
タイトルの大意:
目標点集合までの最短距離を求めます。
問題解決の考え方:
dijkstraアルゴリズムは各点からこの点までの最短ルートを求めて、直接にその中の最短を求めてもいいです。
転載先:https://www.cnblogs.com/fzl194/p/8907741.html
http://acm.hdu.edu.cn/showproblem.php?pid=2066
タイトルの大意:
目標点集合までの最短距離を求めます。
問題解決の考え方:
dijkstraアルゴリズムは各点からこの点までの最短ルートを求めて、直接にその中の最短を求めてもいいです。
1 #include
2 using namespace std;
3 typedef long long ll;
4 const int maxn = 1000 + 10;
5 const int INF = 0x3f3f3f3f;
6 int Map[maxn][maxn];
7 int v[maxn], d[maxn];
8 int a[maxn];
9 int n, m, s, t;
10 void dijkstra(int s)
11 {
12 memset(v, 0, sizeof(v));
13 for(int i = 0; i <= n; i++)d[i] = (i == s ? 0 : INF);
14 for(int i = 0; i <= n; i++)
15 {
16 int x = -1, m = INF;
17 for(int i = 0; i <= n; i++)if(!v[i] && d[i] <= m)m = d[x = i];
18 if(x == -1)break;
19 v[x] = 1;
20 for(int i = 0; i <= n; i++)
21 {
22 if(d[i] > d[x] + Map[x][i])
23 {
24 d[i] = d[x] + Map[x][i];
25 }
26 }
27 }
28 int ans = INF;
29 for(int i = 0; i < t; i++)
30 {
31 ans = min(ans, d[a[i]]);
32 }
33 cout<endl;
34 }
35
36 int main()
37 {
38 while(scanf("%d%d%d", &m, &s, &t) != EOF)
39 {
40 int u, v, w;
41 memset(Map, INF, sizeof(Map));
42 while(m--)
43 {
44 scanf("%d%d%d", &u, &v, &w);
45 n = max(n, max(u, v));
46 if(Map[u][v] > w)
47 {
48 Map[u][v] = Map[v][u] = w;
49 }
50 }
51 while(s--)
52 {
53 scanf("%d", &u);
54 Map[0][u] = Map[u][0] = 0;
55 }
56 for(int i = 0; i < t; i++)cin >> a[i];
57 dijkstra(0);
58 }
59 }
転載先:https://www.cnblogs.com/fzl194/p/8907741.html