User: zhouxc , Problem : 11391 Language : GNU C++ , Judge Result: Accepted Source Code #include "iostream" #define M 10000000 using namespace std; typedef struct TableEntry{ int Dist; bool Known; }; TableEntry Table[502]; int n,m,test,a,b,c,start,end,max,cost[501][501],call[501],cunt[501],munt[501]; void InitTable() { for(int i=0;i<n;i++) { Table[i].Dist=M; Table[i].Known=false; } } void Dijkstra() { InitTable(); Table[start].Dist=0; cunt[start]=1; munt[start]=call[start]; for(int k=1;k<=n;k++) { int record,Min=M; for(int i=0;i<n;i++) { if(!Table[i].Known&&Min>Table[i].Dist) { Min=Table[i].Dist; record=i; } } Table[record].Known=true; // printf("%d %d/n",record,cunt[record]); for(int i=0;i<n;i++) { if((cost[record][i]>0)) { if(Table[i].Dist==Table[record].Dist+cost[record][i]) { cunt[i]+=cunt[record]; if(munt[i]<munt[record]+call[i]) munt[i]=munt[record]+call[i]; } if(Table[i].Dist>Table[record].Dist+cost[record][i]) { Table[i].Dist=Table[record].Dist+cost[record][i]; cunt[i]=cunt[record]; munt[i]=munt[record]+call[i]; } } } } } int main() { freopen("data.in","r",stdin); scanf("%d",&test); while(test--) { scanf("%d%d",&n,&m); memset(cunt,0,sizeof(cunt)); memset(cost,0,sizeof(cost)); for(int i=0;i<n;i++) scanf("%d",&call[i]); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); cost[a][b]=cost[b][a]=c; } scanf("%d%d",&start,&end); Dijkstra(); printf("%d %d/n",cunt[end],munt[end]); } while(1); return 0; }