#include#include #include using namespace std; const int maxm=300;//定义最大边数 int n,m,u[maxm],v[maxm],w[maxm]; int dist[100];//最短距离数组 const int inf=99999999; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&u[i],&v[i],&w[i]); for(int i=1;i<=n;i++) dist[i]=inf; dist[1]=0; for(int i=1;i<=n-1;i++) for(int j=1;j<=m;j++) if(dist[v[j]]>dist[u[j]]+w[j]) dist[v[j]]=dist[u[j]]+w[j]; for(int i=1;i<=n;i++) printf("%d ",dist[i]); return 0; }
下面再补充对Bellmon_Ford算法的队列优化,这种算法也称为SPFA算法,基本思想是:首先将源点s入队列,接着每一次将队首节点取出,将其与相临边进行松弛操作。
#include#include #include #include #include using namespace std; const int maxn=5000; struct Edge//边 { int u,v,d; Edge(){} Edge(int u,int v,int d) { this->u=u,this->v=v,this->d; } }; struct Bellmon_Ford { int n,m,d[maxn],par[maxn]; bool inque[maxn]; vector G[maxn]; vector edges; void init(int n) { this->n=n; for(int i=0;i<=n;i++) G[i].clear(); edges.clear(); } void AddEdge(int u,int v,int d) { edges.push_back(u,v,d); m=edges.size(); G[u].push_back(m-1); } bool bellmon_ford(int s) { memset(cnt,0,sizeof(cnt)); memset(inque,false,sizeof(inque)); memset(d,0x7f7f7f,sizeof(d)); d[s]=0; cnt[s]++; inque[s]=true; queue que; que.push(s); while(!que.empty()) { int u=que.front(); que.pop(); inque[u]=false; for(int i=0;i d[u]+e.d) { d[e.v]=d[e.u]+e.d; par[e.v]=e.u; if(!inque[e.v]) { que.push(e.v); if(++cnt[e.v]>n) { return true; } } } } } return false; } };