Bladeren bron

两点间最短路径

爱玲姐姐 5 jaren geleden
bovenliggende
commit
7cbd8981ba
1 gewijzigde bestanden met toevoegingen van 60 en 0 verwijderingen
  1. 60 0
      F.cpp

+ 60 - 0
F.cpp

@@ -0,0 +1,60 @@
+#include <cstdio>
+#include <algorithm>
+#include <cstring>
+#include <cmath>
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <set>
+#include <queue>
+#include <stack>
+#include <map>
+using namespace std;
+const int maxn = 105;
+const int maxc = 1455;
+const int INF = 999999999;
+int GayHome[maxn];
+int Road[maxc][maxc];
+void Do() {
+    int n,p,c;
+    scanf("%d%d%d",&n,&p,&c);
+    for(int i = 1;i <= p;i++)
+        for(int j = 1;j <= p;j++)
+            Road[i][j] = INF;
+    for(int i = 1;i <= n;i++)
+        scanf("%d",&GayHome[i]);
+    for(int i = 0;i < c;i++) {
+        int a,b,d;
+        scanf("%d%d%d",&a,&b,&d);
+        Road[a][b] = Road[b][a] = d;
+    }
+    for(int i = 1;i <= p;i++)
+        Road[i][i] = 0;
+         
+    for(int k = 1;k <= p;k++)
+        for(int i = 1;i <= p;i++)
+            for(int j = 1;j <= p;j++)
+                Road[i][j] = min(Road[i][k] + Road[k][j],Road[i][j]);
+    /*for(int i = 1;i <= p;i++) {
+        for(int j = 1;j <= p;j++)
+            printf("%5d ",Road[i][j]);
+        printf("\n");
+    }*/
+    long long Min = INF;
+    for(int i = 1;i <= p;i++) {
+        long long  sum = 0;
+        for(int j = 1;j <= n;j++) {
+            sum += Road[i][GayHome[j]];
+        }
+        Min = min(Min,sum);
+    }
+    printf("%lld\n",Min);
+}
+int main() {
+    int T;
+    scanf("%d",&T);
+    while(T--)
+        Do();
+    return 0;
+}