市の緊急救助チームのヘッドとして、あなたは国の特別なマップを持っています。ロードマップに表示するには、都市と都市との接続のいくつかのより急速な分散を有します。そして、二つの都市の高速道路の長さを結ぶ各都市ごとに救助隊の数は、地図上にマークされています。他の都市はあなたに緊急電話を持っていますが、あなたの使命は、多くの救助隊として召集するための方法に沿って、同時に、できるだけ早く事件に駆けつけレスキューチームをリードすることです。
入力フォーマット:
最初の行の入力は、4つの正の整数N(2≤N≤500)は都市の数であるN、M、S、Dを与え、都市は方法を想定0〜(N-1)の番号、Mは高速でありますいくつかの道路; Sは、番号出発都市のポイントであり、Dは、都市の宛先の数です。
2行目は、数字間のスペースで区切られた都市のi番目のI救助チームの数であるN、整数陽性を与えます。その後のM行の各行は、すなわち、情報の高速な方法を提供し、中間スペースで区切られた2、高速道路の1都市、都市の長さを、数値は500以下の整数です。実行可能な最適解ユニークな救助を確保するために入力。
出力フォーマット:
出力の最短パス最初の行及び招集できる救助隊の最大数の数。2行目は、市内番号を介してDからSパスに出力されます。スペースで区切られた数字の間には、出力の最後には、余分なスペースを持つことができません。
サンプル入力:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
出力例:
2 60
0 1 3
100 ++と
#include<iostream>
#include <bits/stdc++.h>
#define Inf 0x3f3f3f3f
using namespace std;
int n,m,s,d;
int mp[505][505];//存放路径
int pace[505];//最短路径条数
int vis[505];//标记是否访问过
int num[505];
int sum[1001];//
int pre[1001];//前驱路径
void Dijkstra(){
pace[s]=vis[s]=1;
for(int i=0;i<n-1;i++){
int MIN=Inf,f=-1;
/***找距离源点最近的,且未被访问**/
for(int j=0;j<n;j++){
if(!vis[j]&&mp[s][j]<MIN){
MIN=mp[s][j];
f=j;
}
}
if(f==-1) break;
vis[f]=1;
for(int j=0;j<n;j++){
if(!vis[j]&&mp[s][j]>mp[s][f]+mp[f][j]){
mp[s][j]=mp[s][f]+mp[f][j];
pre[j]=f;
pace[j]=pace[f];
sum[j]=sum[f]+num[j];
}
else if(!vis[j]&&mp[s][j]==mp[s][f]+mp[f][j]){
pace[j]+=pace[f];
if(sum[j]<sum[f]+num[j]){
pre[j]=f;
sum[j]=sum[f]+num[j];
}
}
}
}
}
int main(){
int city1,city2;
cin>>n>>m>>s>>d;
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i!=j) mp[i][j]=mp[j][i]=Inf;
for(int i=0;i<n;i++){
cin>>num[i];
sum[i]=num[i];
pace[i]=1;
}
for(int i=0;i<m;i++){
cin>>city1>>city2;
cin>>mp[city1][city2];
mp[city2][city1]=mp[city1][city2];
}
Dijkstra();
cout<<pace[d]<<" "<<sum[d]+num[s]<<endl;
int road[1001];
int cur=d,cnt=0;
while(pre[cur]!=0){
road[cnt++]=pre[cur];
cur=pre[cur];
}
//输出
cout<<s;
for(int i=cnt-1;i>=0;i--)
cout<<" "<<road[i];
cout<<" "<<d;
return 0;
}