多源最短路-Floyd

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 const int MAXSIZE=210;
 7 const int INF=(int)1e9;
 8 
 9 int matrix[MAXSIZE][MAXSIZE];
10 int ans[MAXSIZE][MAXSIZE][MAXSIZE];
11 int n,m,t[MAXSIZE];
12 
13 void Floyd()
14 {
15     for (int k=0;k<n;k++)
16     {
17         for (int i=0;i<n;i++)
18         {
19             for (int j=0;j<n;j++)
20             {
21                 matrix[i][j]=min(matrix[i][j],matrix[i][k]+matrix[k][j]);
22             }
23         }
24 
25         for (int i=0;i<n;i++)
26         {
27             for (int j=0;j<n;j++)
28             {
29                 ans[k][i][j]=matrix[i][j];
30             }
31         }
32     }
33     return;
34 }
35 
36 void query(int x,int y,int d)
37 {
38     if (t[x]>d || t[y]>d)   //起点或终点村庄还未重建完成
39     {
40         cout<<"-1"<<endl;
41         return;
42     }
43     else
44     {
45         int ret=INF;
46         for (int k=0;k<n;k++)   //遍历x至y的每个中间村庄
47         {
48             if (t[k]<=d && ans[k][x][y]<INF)   //中间村庄已重建并且能走通
49             {
50                 ret=min(ret,ans[k][x][y]);
51             }
52         }
53         if (ret!=INF)   cout<<ret<<endl;
54         else    cout<<-1<<endl;
55     }
56     return;
57 }
58 
59 int main()
60 {
61     cin>>n>>m;
62     for (int i=0;i<n;i++)
63     {
64         cin>>t[i];
65     }
66 
67     for (int i=0;i<n;i++)
68     {
69         for (int j=0;j<n;j++)
70         {
71             if (i!=j)   matrix[i][j]=INF;
72         }
73     }
74 
75     int u,v,w;
76     for (int i=0;i<m;i++)
77     {
78         cin>>u>>v>>w;
79         matrix[u][v]=matrix[v][u]=w;
80     }
81 
82     Floyd();
83 
84     int q,x,y,d;
85     cin>>q;
86     while (q--)
87     {
88         cin>>x>>y>>d;
89         query(x,y,d);
90     }
91 
92     return 0;
93 }

 

posted @ 2021-12-04 21:36  Hell0er  阅读(32)  评论(0编辑  收藏  举报