`市の緊急救助チームの責任者として、あなたは国の特別なマップを持っています。ロードマップに表示するには、都市と都市との接続のいくつかのより急速な分散を有します。そして、二つの都市の高速道路の長さを結ぶ各都市ごとに救助隊の数は、地図上にマークされています。他の都市はあなたに緊急電話を持っていますが、あなたの使命は、多くの救助隊として召集するための方法に沿って、同時に、できるだけ早く事件に駆けつけレスキューチームをリードすることです。
入力フォーマットは:
最初の行の入力は、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. 3. 5 0
20 30 10 40であり、
0 1 1
1 3 2
0 3 3
0 2 2
2 2 3
出力サンプル:
2 60
0 1 3
/ *長い時間のための優先キューとの最初の時間はそれをしないために、そしてdijstraアルゴリズムに行き、再び良いを見て、その後、自分の書き込みを見て他の人と結合し、最終的には少なすぎる彼が書いた(それを作った、または、アドバイス新入生のメンティーは、給油ああ* /)ああ学ばなければなりません
在这里插入代码片#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int inf = 1e6;
int city[505][505]; //用来标记一个城市到另一个城市的距离
int pre[505]; //最短路径中城市的前驱
bool sign[505]; //标记一个城市是否在最短路径中
int arm[505]; //该城市的军队数目
int sum[505]; //经过最短路径中当前城市的军队总数
int dis[505]; //该城市到起点的最短距离
int art[505] = {0}; //最短路径的条数
struct node{
int n; //城市
int dis; //该城市距离起点的最短距离
node(int _n,int _dis)
{
n = _n;
dis = _dis;
}
bool operator < (const node &a)const //优先队列的优先性,距离起点近的优先级别高
{
return a.dis < dis;
}
};
int n,m,be,en;
void dijstra(int s)
{
memset(dis,inf,sizeof(dis));
dis[s] = 0; //起点到起点的距离为0
sum[s] = arm[s]; //起点到起点军队总数
art[s] = 1; //起点到起点的最短路径条数为 1
priority_queue<node>q;
q.push(node(s,dis[s]));
while(!q.empty())
{
node u = q.top();
q.pop();
if(sign[u.n])
continue;
sign[u.n] = true;
for(int i=0;i<505;i++)
{
if(city[u.n][i]!=inf)
{
if(sign[i])
continue;
if(dis[i] > dis[u.n] + city[u.n][i]) //距离相比较短
{
dis[i] = dis[u.n] + city[u.n][i];
sum[i] = arm[i] + sum[u.n];
pre[i] = u.n;
q.push(node(i,dis[i]));
art[i] = art[u.n]; //更新最短路径条数
}
else if(dis[i] == dis[u.n]+city[u.n][i]) //距离相等,但是军队总数较多
{
if(sum[i] < sum[u.n] + arm[i])
{
sum[i] = arm[i] + sum[u.n];
pre[i] = u.n;
q.push(node(i,dis[i]));
}
art[i]+=art[u.n]; //更新最短路径条数
}
}
}
}
}
void print(int be,int en) //遍历起点到终点经过的城市
{
if(be == en)
{
printf("%d",en);
return ;
}
else
{
print(be,pre[en]);
printf(" %d",en);
}
}
int main()
{
scanf("%d %d %d %d",&n,&m,&be,&en);
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
arm[i] = a;
}
memset(pre,-1,sizeof(pre));
memset(sum,0,sizeof(sum));
memset(sign,false,sizeof(sign));
for(int i=0;i<505;i++)
for(int j=0;j<505;j++)
city[i][j] = inf;
for(int i=0;i<m;i++)
{
int a,b,w;
scanf("%d %d %d",&a,&b,&w);
city[a][b] = w;
city[b][a] = w;
}
dijstra(be);
cout<<art[en]<<" "<<sum[en]<<endl;
print(be,en);
}