首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。