l2-001
最短路板子题,打印路径
代码:
#include<bits/stdc++.h> const int maxn=1e3+10; const int inf=0x3f3f3f3f; using namespace std; int n,m,s,d; struct node { int vis; int dis; int path=-1; int num;//救援队数目 int getnum;//最短长度 int cnt; }a[maxn]; //vector<int> G[maxn]; //int dist[maxn][maxn]; int G[maxn][maxn]; void init(int start) { for(int i=0; i<n; i++) { a[i].vis=0; a[i].dis=inf; a[i].cnt=0; } a[start].dis=0; } void printpath(int v) { if(a[v].path!=v) { printpath(a[v].path); printf(" %d",v); return ; } printf("%d",v); } void dijkstra(int s) { int cur=s; a[cur].cnt=1; a[cur].vis=1; a[cur].getnum=a[cur].num; a[cur].dis=0; a[cur].path=cur; for(int v=0; v<n; v++) { int ans=inf; for(int w=0; w<n; w++) { if(cur==w) continue; if(!a[w].vis&&a[cur].dis+G[cur][w]<a[w].dis&&a[cur].dis!=inf) { a[w].dis=a[cur].dis+G[cur][w]; a[w].path=cur; a[w].getnum=a[cur].getnum+a[w].num; a[w].cnt=a[cur].cnt; } else if(a[cur].dis+G[cur][w]==a[w].dis) { a[w].cnt+=a[cur].cnt; if(a[w].getnum<a[cur].getnum+a[w].num) { a[w].getnum=a[cur].getnum+a[w].num; a[w].path=cur; } } } for(int w=0; w<n; w++) { if(cur==w) continue; if(!a[w].vis&&a[w].dis<ans) { ans=a[w].dis; cur=w; } } a[cur].vis=1; } } int main() { scanf("%d%d%d%d",&n,&m,&s,&d); for(int i=0; i<n; i++) scanf("%d",&a[i].num); for(int i=0; i<n; i++) for(int j=0; j<n; j++) G[i][j]=inf; for(int i=0; i<m; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); G[u][v]=G[v][u]=w; } init(s); dijkstra(s); printf("%d %d\n",a[d].cnt,a[d].getnum); printpath(d); system("pause"); return 0; }