PAT 1003. Emergency
1931 ワード
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
#define mx 505
struct edge
{
int c;
int len;
};
vector<edge> E[mx];
int city[mx];
int dis[mx];
int visited[mx];
int ccnt[mx];//the number of different shortest path
int csave[mx];
int main()
{
int n,m,c1,c2;
scanf("%d %d %d %d",&n,&m,&c1,&c2);
for(int i=0;i<mx;i++) //init
{
E[i].clear();
dis[i]=-1;
}
for(int i=0;i<n;i++){
scanf("%d",&city[i]);
}
for(int i=0;i<m;i++)
{
edge tmp;
int a,b,l;
scanf("%d %d %d",&a,&b,&l);
tmp.len=l;
tmp.c=b;
E[a].push_back(tmp);
tmp.c=a;
E[b].push_back(tmp);
}
int nowP=c1;
dis[nowP]=0;
visited[nowP]=1;
csave[nowP]=city[c1];
ccnt[nowP]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<E[nowP].size();j++)
{
int tmpc=E[nowP][j].c;
int d=E[nowP][j].len;
if(visited[tmpc]==1) continue;
if(dis[tmpc]==-1||dis[tmpc]>dis[nowP]+d)
{
dis[tmpc]=dis[nowP]+d;
csave[tmpc]=city[tmpc]+csave[nowP];
ccnt[tmpc]=ccnt[nowP];
}else if(dis[tmpc]==dis[nowP]+d)
{
ccnt[tmpc]+=ccnt[nowP];
if(csave[tmpc]<city[tmpc]+csave[nowP]){
csave[tmpc]=city[tmpc]+csave[nowP];
}
}
}
int min=123456789;
for(int j=0;j<n;j++){
if(dis[j]==-1) continue;
if(visited[j]==1) continue;
if(dis[j]<min)
{
min=dis[j];
nowP=j;
}
}
visited[nowP]=1;
}
printf("%d %d
",ccnt[c2],csave[c2]);
return 0;
}