1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <algorithm>
6
7 using namespace std;
8 typedef long long ll;
9 const int inf=0x3f3f3f3f;
10 const int o=505;
11 bool vis[o];
12 int n, m, be, en;
13 int mp[o][o], d[o], ha[o];
14 int num[o], ans[o]={0};
15 void dij(int x)
16 {
17 memset(vis, 0, sizeof(vis));
18 for(int i=0; i<n; ++i)
19 {
20 int u, mini=inf;
21 for(int j=0; j<n; ++j)
22 {
23 if(!vis[j]&&d[j]<=mini)
24 {
25 u=j;
26 mini=d[j];
27 }
28 }
29 vis[u]=true;
30 for(int j=0; j<n; ++j)
31 {
32 if(d[j]>d[u]+mp[j][u])
33 {
34 d[j]=d[u]+mp[j][u];
35 }
36 }
37 }
38 }
39 void xunzhao(int x)
40 {
41 memset(num, 0, sizeof(num));
42 memset(vis, 0, sizeof(vis));
43 for(int i=0; i<n; ++i)
44 {
45 int u;
46 for(int j=n-1; j>=0; --j)
47 {
48 if(!vis[j])
49 {
50 u=j;
51 }
52 }
53 vis[u]=true;
54 for(int j=0; j<n; ++j)
55 {
56 if(d[j]==d[u]+mp[u][j])
57 {
58 if(num[u]>1) num[j]=num[u];
59 else num[j]++;
60 ans[j]=max(ans[j], ans[u]+ha[j]);
61 }
62 }
63 }
64 }
65 int main()
66 {
67 cin >>n>>m>>be>>en;
68 for(int i=0; i<505; ++i)
69 {
70 d[i]=inf;
71 for(int j=0; j<505; ++j)
72 {
73 mp[i][j]=inf;
74 }
75 }
76 for(int i=0; i<n; ++i)
77 {
78 scanf("%d", &ha[i]);
79 }
80 for(int i=0; i<m; ++i)
81 {
82 int x, y, z;
83 scanf("%d %d %d", &x, &y, &z);
84 mp[x][y]=mp[y][x]=z;
85 }
86 d[be]=0;
87 dij(en);
88 xunzhao(en);
89 xunzhao(en);
90 if(be==en)
91 printf("%d %d\n", num[en], ha[be]);
92 else cout <<num[en]<<" "<<ans[en]+ha[be]<<endl;
93
94 return 0;
95 }
用了十分偷懒蠢笨的方式,但是还是没有取得满分,从循环几百次试了无数次减到循环两次就可以达到这个效果,果然,我是专业骗分hhh
希望不久的将来我能把这个题完美的解答出来!!!
![]()