马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x


- #include <cstdio>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int maxn = 505;
- int G[maxn][maxn],rescueNum[maxn],vis[maxn]={0},dis[maxn],teamNum[maxn]={0},pathNum[maxn]={0};
- int n,m,s,e,INF=1000000000;
- int findNotVisMin(){
- int minIdx = -1;
- int minDis = INF;
- for(int i = 0; i < n; i++){
- if(vis[i] == 0 && dis[i] < minDis){
- minIdx = i;
- minDis = dis[i];
- }
- }
- return minIdx;
- }
- int main() {
- scanf("%d%d%d%d", &n, &m, &s, &e);
- int tmp,from,to,weight;
- for(int i = 0; i < n; i++){
- scanf("%d", &tmp);
- rescueNum[i] = tmp;
- }
- fill(G[0], G[0]+maxn*maxn, INF);
- for(int i = 0; i < m; i++){
- scanf("%d%d%d", &from, &to, &weight);
- G[from][to] = G[to][from] = weight;
- }
- fill(dis, dis+maxn, INF);
- dis[s] = 0;
- teamNum[s] = rescueNum[s];
- pathNum[s] = 1;
- for(int i = 0; i < n; i++){
- int min = findNotVisMin();
- if(min == -1) break;
- vis[min] = 1;
- for(int j = 0; j < n; j++){
- if(vis[j] == 0 && G[min][j] != INF){
- if(dis[min]+G[min][j] < dis[j]){
- dis[j] = dis[min]+G[min][j];
- pathNum[j] = pathNum[min];
- teamNum[j] = teamNum[min] + rescueNum[j];
- }else if(dis[min]+G[min][j] == dis[j]){
- pathNum[j] += pathNum[min];
- if(teamNum[min]+rescueNum[j] > teamNum[j]){
- teamNum[j] = teamNum[min]+rescueNum[j];
- }
- }
- }
- }
- }
- printf("%d %d\n", pathNum[e], teamNum[e]);
- return 0;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |