输入:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
输出:
2 60
0 1 3
优先队列:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int dist[505],path[505],num[505],pathNum[505],cnt[505];
int n,m,s,d,g[505][505],vis[505];
struct node {
int u,dis;
bool operator < (const node &a) const {
return dis<a.dis;
}
};
void dijk() {
for(int i=0; i<=n; i++) {
dist[i] = inf;
path[i]=-1;
cnt[i]=0;
vis[i]=0;
pathNum[i]=0;
}
dist[s]=0;
cnt[s]=num[s];
pathNum[s]=1;
int minn,k;
priority_queue<pair<int,int> >q;
q.push(make_pair(-dist[s],0));
while(!q.empty()) {
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=0; i<n; i++) {
if(g[u][i]&&i!=u) {
if(dist[i]>dist[u]+g[u][i]) {
dist[i]=dist[u]+g[u][i];
path[i]=u;
cnt[i]=cnt[u]+num[i];
pathNum[i]=pathNum[u];
q.push(make_pair(-dist[i],i));
}
else if(dist[i]==dist[u]+g[u][i]) {
if(cnt[i]<cnt[u]+num[i]) {
cnt[i]=cnt[u]+num[i];
path[i]=u;
q.push(make_pair(-dist[i],i));
}
pathNum[i]+=pathNum[u];
}
}
}
}
cout<<pathNum[d]<<' '<<cnt[d]<<endl;
int pre=path[d];
vector<int>ans;
ans.push_back(d);
while(pre!=-1) {
ans.push_back(pre);
pre=path[pre];
}
for(int i=ans.size()-1; i>=0; i--) {
if(i==ans.size()-1) cout<<ans[i];
else cout<<' '<<ans[i];
}
cout<<endl;
}
int main() {
cin>>n>>m>>s>>d;
for(int i=0; i<n; i++) {
cin>>num[i];
}
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
g[u][v]=g[v][u]=w;
}
dijk();
return 0;
}
优先队列(不用pair):
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int dist[505],path[505],num[505],pathNum[505],cnt[505];
int n,m,s,d,g[505][505],vis[505];
struct node {
int u,dis;
node(int uu,int diss) {
u=uu;
dis=diss;
}
bool operator < (const node &a) const {
return dis>a.dis;
}
};
void dijk() {
for(int i=0; i<=n; i++) {
dist[i] = inf;
path[i]=-1;
cnt[i]=0;
vis[i]=0;
pathNum[i]=0;
}
dist[s]=0;
cnt[s]=num[s];
pathNum[s]=1;
int minn,k;
priority_queue<node>q;
q.push(node(0,dist[s]));
while(!q.empty()) {
int u=q.top().u;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=0; i<n; i++) {
if(g[u][i]&&i!=u) {
if(dist[i]>dist[u]+g[u][i]) {
dist[i]=dist[u]+g[u][i];
path[i]=u;
cnt[i]=cnt[u]+num[i];
pathNum[i]=pathNum[u];
q.push(node(i,dist[i]));
}
else if(dist[i]==dist[u]+g[u][i]) {
if(cnt[i]<cnt[u]+num[i]) {
cnt[i]=cnt[u]+num[i];
path[i]=u;
q.push(node(i,dist[i]));
}
pathNum[i]+=pathNum[u];
}
}
}
}
cout<<pathNum[d]<<' '<<cnt[d]<<endl;
int pre=path[d];
vector<int>ans;
ans.push_back(d);
while(pre!=-1) {
ans.push_back(pre);
pre=path[pre];
}
for(int i=ans.size()-1; i>=0; i--) {
if(i==ans.size()-1) cout<<ans[i];
else cout<<' '<<ans[i];
}
cout<<endl;
}
int main() {
cin>>n>>m>>s>>d;
for(int i=0; i<n; i++) {
cin>>num[i];
}
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
g[u][v]=g[v][u]=w;
}
dijk();
return 0;
}
正常做法:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int dist[505],path[505],num[505],pathNum[505],cnt[505];
int n,m,s,d,g[505][505],vis[505];
struct node {
int u,dis;
bool operator < (const node &a) const {
return dis<a.dis;
}
};
void dijk() {
for(int i=0; i<=n; i++) {
dist[i] = inf;
path[i]=-1;
cnt[i]=0;
vis[i]=0;
pathNum[i]=0;
}
dist[s]=0;
cnt[s]=num[s];
pathNum[s]=1;
int minn,k;
while(true) {
k=-1,minn=inf;
for(int i=0; i<n; i++) {
if(!vis[i]) {
if(dist[i]<minn) {
minn=dist[i];
k=i;
}
}
}
if(k==-1) break;
vis[k]=1;
for(int i=0; i<n; i++) {
if(i!=k&&g[k][i]) {
if(dist[i]>dist[k]+g[k][i]) {
dist[i]=dist[k]+g[k][i];
path[i]=k;
cnt[i]=cnt[k]+num[i];
pathNum[i]=pathNum[k];
}
else if(dist[i]==dist[k]+g[k][i]) {
if(cnt[i]<cnt[k]+num[i]) {
cnt[i]=cnt[k]+num[i];
path[i]=k;
}
pathNum[i]=pathNum[k]+pathNum[i];
}
}
}
}
cout<<pathNum[d]<<' '<<cnt[d]<<endl;
int pre=path[d];
vector<int>ans;
ans.push_back(d);
while(pre!=-1) {
ans.push_back(pre);
pre=path[pre];
}
for(int i=ans.size()-1; i>=0; i--) {
if(i==ans.size()-1) cout<<ans[i];
else cout<<' '<<ans[i];
}
cout<<endl;
}
int main() {
cin>>n>>m>>s>>d;
for(int i=0; i<n; i++) {
cin>>num[i];
}
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
g[u][v]=g[v][u]=w;
}
dijk();
return 0;
}