(第一时间思路)
原题:
思路:
1.首先想到的是单源最短路径djs求解
2.然后需要保存最短路的条数和所能号召的人数
3.最后感觉比较类似dp
源代码:
#include<iostream>
using namespace std;
#define INT_MAX 0xfffffff
int map[505][505]; //地图
int N, M, C1, C2; //N城镇数,M道路数,C1我的位置,C2遇险城镇
int peoplenum[505]; //每个城镇的人数
int minlennum[505]; //到每个城镇的最短路的个数
int maxnum[505]; //到每个城镇最大可召集的人数
int vis[505]; //访问标志
int tmp[505]; //最短路长度
int main(){
cin>>N>>M>>C1>>C2;
for(int i = 0; i < N; i ++){
cin>>peoplenum[i];
vis[i] = 0;
minlennum[i] = 0;
tmp[i] = INT_MAX;
}
for(int i = 0; i < M; i ++){
int x, y, w;
cin>>x>>y>>w;
map[x][y] = w;
map[y][x] = w;
}
tmp[C1] = 0; //边界条件
minlennum[C1] = 1; //边界条件
maxnum[C1] = peoplenum[C1];//边界条件
for(int i = 0; i < N; i ++){ //经典djs
int minlen = INT_MAX;
int u = -1;
for(int j = 0; j < N; j ++){
if(!vis[j] && tmp[j] < minlen){
minlen = tmp[j];
u = j;
}
}
if(u == -1) break; //跳出条件
vis[u] = 1;
for(int v = 0; v < N; v ++){
if(!vis[v] && map[u][v] != 0){
if(tmp[u] + map[u][v] < tmp[v]){
tmp[v] = tmp[u] + map[u][v];
minlennum[v] = minlennum[u];//对路条数的改动
maxnum[v] = maxnum[u] + peoplenum[v];
}else if(tmp[u] + map[u][v] == tmp[v]){//对路条数的改动
minlennum[v] += minlennum[u];
if(maxnum[u] + peoplenum[v] > maxnum[v])
maxnum[v] = maxnum[u] + peoplenum[v];
}
}
}
}
cout<<minlennum[C2]<<" "<<maxnum[C2];
}
已AC:
易失分点:
1.忘记添加跳出条件
2.pat的编译器不能直接用INT_MAX