F.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <string>
  6. #include <iostream>
  7. #include <vector>
  8. #include <list>
  9. #include <set>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. using namespace std;
  14. const int maxn = 105;
  15. const int maxc = 1455;
  16. const int INF = 999999999;
  17. int GayHome[maxn];
  18. int Road[maxc][maxc];
  19. void Do() {
  20. int n,p,c;
  21. scanf("%d%d%d",&n,&p,&c);
  22. for(int i = 1;i <= p;i++)
  23. for(int j = 1;j <= p;j++)
  24. Road[i][j] = INF;
  25. for(int i = 1;i <= n;i++)
  26. scanf("%d",&GayHome[i]);
  27. for(int i = 0;i < c;i++) {
  28. int a,b,d;
  29. scanf("%d%d%d",&a,&b,&d);
  30. Road[a][b] = Road[b][a] = d;
  31. }
  32. for(int i = 1;i <= p;i++)
  33. Road[i][i] = 0;
  34. for(int k = 1;k <= p;k++)
  35. for(int i = 1;i <= p;i++)
  36. for(int j = 1;j <= p;j++)
  37. Road[i][j] = min(Road[i][k] + Road[k][j],Road[i][j]);
  38. /*for(int i = 1;i <= p;i++) {
  39. for(int j = 1;j <= p;j++)
  40. printf("%5d ",Road[i][j]);
  41. printf("\n");
  42. }*/
  43. long long Min = INF;
  44. for(int i = 1;i <= p;i++) {
  45. long long sum = 0;
  46. for(int j = 1;j <= n;j++) {
  47. sum += Road[i][GayHome[j]];
  48. }
  49. Min = min(Min,sum);
  50. }
  51. printf("%lld\n",Min);
  52. }
  53. int main() {
  54. int T;
  55. scanf("%d",&T);
  56. while(T--)
  57. Do();
  58. return 0;
  59. }