Dijkstra+优化
#include<iostream>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<iomanip>
#include<vector>
#include<queue>
using namespace std;
const int M=205;
int vis[M];
int n,m,dis[M],pre[M];
struct edge{
int v,w;
edge(){}
edge(int V,int W){
v=V;w=W;
}
};
struct node{
int u,dis;
node(){}
node(int U,int D){
u=U;dis=D;
}
friend bool operator < (node a,node b){return a.dis>b.dis;}
};
priority_queue<node>Q;
vector<edge> G[M];
void _make(){
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
memset(dis,0x3f,sizeof(dis));
pre[S]=0,dis[S]=0,Q.push(node(S,0));
}
void add(int U,int V,int W){
G[U].push_back(edge(V,W));
G[V].push_back(edge(U,W));
}
int Dijkstra(int S,int T){
_make();
while(!Q.empty()){
int u=Q.top().u;
Q.pop();
if(vis[u])
continue;
vis[u]=1;
int v,w,siz=G[u].size();
for(int i=0;i<siz;i++){
v=G[u][i].v,w=G[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
pre[v]=u;
Q.push(node(v,dis[v]));
}
}
}
return dis[T];
}
void find(int x){
if(!pre[x]) return;
find(pre[x]);
printf("%d ",x);
}
int main(){
int s,t;
scanf("%d %d",&n,&m);
for(int i=1,x,y,z;i<=m;i++){
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
scanf("%d %d",&s,&t);
int ans=Dijkstra(s,t);
printf("%d\n",ans);
printf("%d ",s);
find(t);
return 0;
}
Bellman_Ford 按字典序输出路径
#include<iostream>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<iomanip>
#include<vector>
#include<queue>
using namespace std;
const int M=505,N=20005;
int n,m,dis[M],pre[M],tot[M];
struct edge{
int u,v,w;
edge(){}
edge(int U,int V,int W){
u=U;v=V;w=W;
}
};
edge G[N];
void Make(int S,int T){
memset(dis,0x3f,sizeof(dis));
memset(pre,0x3f,sizeof(pre));
memset(tot,0x3f,sizeof(tot));
dis[S]=0;pre[S]=0;tot[S]=0;
for(int i=1;i<=m;i++){
if(G[i].u==S){
dis[G[i].v]=G[i].w;
tot[G[i].v]=1;
}
}
}
void add(int i,int U,int V,int W){
G[i]=edge(U,V,W);
}
bool check(int u,int v,int w){
if(dis[v]>dis[u]+w){
return false;
}
return true;
}
void relax(int u,int v,int w){
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
pre[v]=u;
tot[v]=tot[u]+1;
}
else {
if(dis[v]==dis[u]+w){
if(tot[v]>tot[u]+1){
tot[v]=tot[u]+1;
pre[v]=u;
}
else
if(tot[v]==tot[u]+1){
if(pre[v]>u) pre[v]=u;
}
}
}
}
void find(int x){
if(!pre[x]) return;
find(pre[x]);
printf("%d ",x);
}
bool Bellman_Ford(int S,int T){
Make(S,T);
dis[S]=0;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m;j++){
relax(G[j].u,G[j].v,G[j].w);
}
}
for(int i=1;i<=m;i++){
if(check(G[i].u,G[i].v,G[i].w)==false)
return false;
}
return true;
}
int main(){
int s,t;
scanf("%d %d",&n,&m);
for(int i=1,x,y,z;i<=m;i++){
scanf("%d %d %d",&x,&y,&z);
add(i,x,y,z);
}
scanf("%d %d",&s,&t);
if(Bellman_Ford(s,t)==true){
printf("%d\n",dis[t]);
printf("%d ",s);
find(t);
}
else printf("No Solution");
return 0;
}
SPFA+路径输出
#include<iostream>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<iomanip>
#include<vector>
#include<queue>
using namespace std;
const int M=5005,N=6205;
int n,m,dis[M],tot[M],pre[M];
bool vis[M],flag;
struct edge{
int v,w;
edge(){}
edge(int V,int W){
v=V;w=W;
}
};
vector<edge> G[M];
queue<int> Q;
void Make(int S,int T){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(tot,0,sizeof(tot));
dis[S]=0;vis[S]=1;tot[S]=1;pre[S]=0;Q.push(S);
}
void add(int U,int V,int W){
G[U].push_back(edge(V,W));
G[V].push_back(edge(U,W));
}
void relax(int u,int v,int w){
if(dis[v]>=dis[u]+w){
dis[v]=dis[u]+w;
if(vis[v]==0){
vis[v]=1;
tot[v]++;
if(tot[v]>n){
flag=1;return;
}
pre[v]=u;
Q.push(v);
}
}
}
bool SPFA(int S,int T){
Make(S,T);
while(!Q.empty()){
int u=Q.front();Q.pop();
vis[u]=0;
int siz=G[u].size();
for(int i=0;i<siz;i++){
int v=G[u][i].v,w=G[u][i].w;
relax(u,v,w);
if(flag) return false;
}
}
return true;
}
void find(int x){
if(!pre[x]) return;
find(pre[x]);
printf("%d ",x);
}
int main(){
int s,t;
scanf("%d %d",&n,&m);
scanf("%d %d",&s,&t);
for(int i=1,x,y,z;i<=m;i++){
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
if(SPFA(s,t)==true){
printf("%d\n",dis[t]);
printf("%d ",s);find(t);
}
else
printf("No Solution");
return 0;
}