1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <stack> 7 using namespace std; 8 const int maxn=505; 9 const int INF=0x3f3f3f3f; 10 int n,m,s,d; 11 int sp[maxn]; //救援人数 12 int dj[maxn]; //距离起点最短距离 13 int vis[maxn];//是否列入集合 14 int road[maxn];//最短路径条数 15 int path[maxn];//前缀节点 16 int total[maxn];//总救援人数 17 struct city 18 { 19 int e; 20 int len; 21 }; 22 vector <city> ve[maxn]; 23 //初始化 24 void init () 25 { 26 memset (vis,0,sizeof(vis)); 27 memset (total,0,sizeof(total)); 28 memset (road,0,sizeof(road)); 29 memset (path,-1,sizeof(path)); 30 for (int i=0;i<n;i++) 31 dj[i]=INF; 32 dj[s]=0; 33 total[s]=sp[s]; 34 road[s]=1; 35 } 36 void djst () 37 { 38 while (1) 39 { 40 int maxx=INF; 41 int u=-1; 42 for (int i=0;i<n;i++) 43 if(dj[i]<maxx&&!vis[i]) 44 { 45 maxx=dj[i]; 46 u=i; 47 } 48 if(u==-1)//如果u依旧还是等于-1说明全部点都已经最小了,循环结束 49 break; 50 vis[u]=1;//不然以u点作为中介来向周围扩展 51 for (int i=0;i<ve[u].size();i++) 52 { 53 int v=ve[u][i].e;//以u点通过u点的边能找到v点,从而扩散v点 54 if(!vis[v])//如果v点还没访问过 55 { 56 if(dj[v]>dj[u]+ve[u][i].len)//如果直接到v点比通过u到达v更远,则更新一下 57 { 58 dj[v]=dj[u]+ve[u][i].len; 59 path[v]=u;//记录一下路径,到v的前驱是u 60 road[v]=road[u];//到v的最短路径与到u的最短路径条数一样 61 total[v]=total[u]+sp[v];//到v的救援人数是到u的人数+v的救援人数 62 63 } 64 else if(dj[v]==dj[u]+ve[u][i].len)//如果直接到V和通过u到v的长度一样 65 { 66 //这里要写到if语句外面 67 road[v]+=road[u];//那到v的最短路径数就要加上到u的最短路径条数 68 if(total[u]+sp[v]>total[v])//更新救援人数和路径,因为题目中救援人数是第二关键字 69 { 70 path[v]=u;//如果可以更新,那么v的前驱就必须是u 71 total[v]=total[u]+sp[v]; 72 } 73 } 74 } 75 } 76 } 77 } 78 //输出函数 79 void output() 80 { 81 printf("%d %d ",road[d],total[d]); 82 int temp=d; 83 stack<int>ss; 84 while (path[temp]!=-1) 85 { 86 ss.push(temp); 87 temp=path[temp]; 88 } 89 ss.push(s); 90 while (!ss.empty()) 91 { 92 printf("%d%c",ss.top(),ss.size()==1? ' ':' '); 93 ss.pop(); 94 } 95 } 96 int main() 97 { 98 scanf("%d%d%d%d",&n,&m,&s,&d); 99 for (int i=0;i<n;i++) 100 scanf("%d",&sp[i]); 101 init(); 102 for (int i=0;i<m;i++) 103 { 104 int x,y,len; 105 scanf("%d%d%d",&x,&y,&len); 106 city temp1,temp2; 107 temp1.e=y; temp1.len=len; 108 temp2.e=x; temp2.len=len; 109 ve[x].push_back(temp1);//无向图 110 ve[y].push_back(temp2); 111 } 112 djst(); 113 output(); 114 return 0; 115 }