图论最短路Dijkstra+heap和SPFA
SPFA算法最短路(即Bellman-Ford队列优化)
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define INF 0x3f3f3f3f using namespace std; int head[101],cnt; int dis[101]; bool inq[101]; struct EDGE { int next; int to; int w; }edge[101]; void add(int u,int v,int w) { edge[++cnt].next=head[u]; edge[cnt].to=v; edge[cnt].w=w; head[u]=cnt; } void SPFA(int startpoint) { memset(dis,INF,sizeof(dis)); memset(inq,false,sizeof(inq)); int s=startpoint; dis[s]=0; queue<int> q; q.push(s); inq[s]=true; while(!q.empty()) { int u=q.front(); q.pop(); inq[u]=false; for(int i=head[u];i!=0;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[u]+edge[i].w) { dis[v]=dis[u]+edge[i].w; if(!inq[v]) { q.push(v); inq[v]=true; } } } } } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } SPFA(1); cout<<dis[3];//测试用输出 return 0; }
dijkstra堆优化:
#include <iostream> #include <cstdio> #include <queue> #define maxn 200005 #define INF 0x3f3f3f3f using namespace std; int head[maxn],cnt; int n,m,s; bool visited[maxn]; struct EDGE { int to; int next; int w; }edge[maxn]; struct node { int dis,index; bool operator < (const node &k)const { return dis>k.dis;//因为要保证dis小的优先,所以dis从大到小排序 } }d[maxn]; void add(int u,int v,int w) { edge[++cnt].next=head[u]; edge[cnt].to=v; edge[cnt].w=w; head[u]=cnt; } void dijkstra() { for(int i=1;i<=n;i++) { visited[i]=false; d[i].dis=INF; d[i].index=i; } priority_queue<node> q; d[s].dis=0;q.push(d[s]); while(!q.empty()) { int u=q.top().index; q.pop(); if(visited[u])continue; visited[u]=1; for(int i=head[u];i!=0;i=edge[i].next) { int v=edge[i].to; if(d[v].dis>d[u].dis+edge[i].w) { d[v].dis=d[u].dis+edge[i].w; q.push(d[v]); } } } } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } dijkstra(); for(int i=1;i<=n;i++) { printf("%d ",d[i].dis); } return 0; }