1003 Emergency (25分)
比较早时候做的题,所以不算太规范
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#define maxf 0x3f3f3f3f
using namespace std;
int access[501][501];
int cost[501];
int emer[501];
int num[501];
int c1,c2;
int n,m;
int visit[501];
int tot[501];
void init(){ //初始化
memset(tot, 0, sizeof(tot));
memset(cost, 0x3f, sizeof(cost));
memset(visit, 0, sizeof(visit));
memset(num, 0, sizeof(num));
}
void djsk(){
num[c1] = emer[c1];
tot[c1]=1;
for(int i=0;i<n;i++){
int v=-1;
for(int j=0;j<n;j++){
if(!visit[j]&&(v==-1||cost[j]<cost[v]))
v=j;
}
visit[v]=1;
for(int j=0;j<n;j++)
{
if(v==j)continue;
if(cost[j]==cost[v]+access[v][j]){
tot[j]+=tot[v];
num[j]=max(num[j],num[v]+emer[j]);
}
else if(cost[j]>cost[v]+access[v][j]){
cost[j]=cost[v]+access[v][j];
tot[j]=tot[v];
num[j]=num[v]+emer[j];
}
}
}
}
int main()
{
int tx,ty,temp;
cin>>n>>m>>c1>>c2;
init();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
access[i][i]=0;
if(j!=i)
access[i][j]=maxf;
}
for(int i=0;i<n;i++)
cin>>emer[i];
while (m--){
cin>>tx>>ty>>temp;
access[tx][ty]=temp;
access[ty][tx]=temp;
}
cost[c1]=0;
djsk();
cout<<tot[c2]<<' '<<num[c2];
return 0;
}