标签:fill 长度 class false its inpu 路径 pat int
#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; }
标签:fill 长度 class false its inpu 路径 pat int
原文地址:https://www.cnblogs.com/CGJobs/p/11304054.html