您的位置:首页 > 其它

城市间紧急救援-多维最短路

2016-12-08 19:58 281 查看
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int N=505;
int n,m,s,d;
int ren
;
int ma

;
int cnt
;
int vis
;
int pre
,dis
,nn
;
void dij()
{
for(int i=0;i<n;i++)
{
dis[i]=ma[s][i];
vis[i]=0;
pre[i]=-1;

if(dis[i]!=INF)
cnt[i]=1,nn[i]=ren[i];
else
cnt[i]=0,nn[i]=0;
}
dis[s]=0;
vis[s]=1;
nn[s]=ren[s];
for(int i=0;i<n;i++)
{
int mitt=INF;
int k=-1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<mitt)
{
mitt=dis[k=j];
}
}
if(k==-1||k==d)
return;
vis[k]=1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+ma[k][j])
{
dis[j]=dis[k]+ma[k][j];
nn[j]=nn[k]+ren[j];
pre[j]=k;
cnt[j]=cnt[k];
}
else if(!vis[j]&&dis[j]==dis[k]+ma[k][j])
{
cnt[j]+=cnt[k];
if(nn[j]<nn[k]+ren[j])
nn[j]=nn[k]+ren[j],pre[j]=k;
}
}
}
}
int main()
{
int ans[505];
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=0;i<n;i++)
{
scanf("%d",&ren[i]);
vis[i]=0;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ma[i][j]=INF;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(ma[a][b]>c) ma[a][b]=ma[b][a]=c;
}
vis[s]=1;
dij();
printf("%d %d\n",cnt[d],nn[d]+ren[s]);
ans[0]=d;
int flag=1;
for(int i=pre[d];i!=-1;i=pre[i])
ans[flag++]=i;
printf("%d",s);
for(int i=flag-1;i>=0;i--)
printf(" %d",ans[i]);
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: