首页 > 代码库 > PAT 甲级 1003 Emergency

PAT 甲级 1003 Emergency

 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
希望不久的将来我能把这个题完美的解答出来!!!

技术分享

PAT 甲级 1003 Emergency