PAT1003

#include<iostream>
#include<cstring>
#include<climits>
using namespace std;

int n, m, c1, c2;
//dis[i]从起点到i的最短路径,num[i]为长度,weight[i]为i城的救援小组人数,w[i]为到i城已经接到的救援人数,e[][]路径权重
int dis[500], num[500], weight[500], w[500], e[500][500]; bool visit[500] = {false}; const int MAX = 99999999; int main() { while(cin>>n>>m>>c1>>c2) { //input for(int i = 0; i < n; i++) cin>>weight[i]; int _s, _e, _w; fill(e[0], e[0] + 500 * 500, MAX); fill(dis, dis + 500, MAX); for(int i = 0; i < m; i++) { cin>>_s>>_e>>_w; e[_s][_e] = e[_e][_s] = _w; } dis[c1] = 0; num[c1] = 1; w[c1] = weight[c1];     
    
     //循环dis[0] ----> dis[max]
for(int i = 0; i < n; i++) { int _min = MAX, u = -1; for(int j = 0; j < n; j++) { if(!visit[j] && dis[j] < _min) { u = j; _min = dis[j]; } } if(u == -1) break; visit[u] = true; for(int v = 0; v < n; v++) { if(!visit[v]&& e[u][v] != MAX) {
            //最短路径长度
if(dis[u] + e[u][v] < dis[v]) { dis[v] = dis[u] + e[u][v]; num[v] = num[u]; w[v] = w[u] + weight[v]; } else if(dis[u] + e[u][v] == dis[v]) { num[v] = num[v] + num[u]; if(w[u] + weight[v] > w[v]) w[v] = w[u] + weight[v]; } } } } cout<<num[c2]<<" "<<w[c2]<<endl; } return -1; }

 

转载于:https://www.cnblogs.com/CGJobs/p/11304054.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值