洛谷_3371 单源最短路径
2018-03-24 16:06
246 查看
题意
给出一个有向图,求从一个点到其它每一个点的距离。思路
因为比赛有一题要用SPFA,所以我来用SPFA做一下这题。我们先做一次spfa,然后从1到n输出从起点到点i的距离就好了。代码
#include<algorithm> #include<queue> #include<cstdio> using namespace std; int n,m,s,tot,dis[10005],head[500005]; bool vis[10005]; struct Edge{ int next,to,w; }f[500005]; void add(int u,int v,int w)//用邻接表建图 { f[++tot].next=head[u];//指向从u点出发的下一条边 f[tot].to=v;//指向第二个点 f[tot].w=w;//记录权值 head[u]=tot;//记录最后一次出现的位置 } queue<int> q;//stl库的队列 void spfa() { for(int i=1; i<=n; i++) dis[i]=2147483647;//初始化距离为一个很大的数 int u,v; q.push(s);//让起点先入队 dis[s]=0;//初始化 vis[s]=1;//v[s]表示节点s是否在队列里 while(!q.empty())//如果队列不为空 { u=q.front();//取队首 q.pop();//相当于head+1,就是让队首出队 vis[u]=0;//要释放标记,因为有可能再次进入队列 for(int i=head[u];i;i=f[i].next)//枚举起点为u { //的边 v=f[i].to;//v为这条边的第二个点 if(dis[v]>dis[u]+f[i].w)//松弛操作,这里和 { //就是更新最短距离 dis[v]=dis[u]+f[i].w; if(!vis[v]) { vis[v]=1;//记录 q.push(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);//建图 } spfa(); for(int i=1;i<=n;i++) printf("%d ",dis[i]);//输出u到i的最短距离 }
相关文章推荐
- (洛谷 3371)【模(mú)板】单源最短路径
- 洛谷 3371_单源最短路径_spfa
- [洛谷3371]【模板】单源最短路径
- 洛谷 P3371 【模板】单源最短路径
- P3371 单源最短路径【模板】 洛谷
- luoguP3371 【模板】单源最短路径(SPFA)
- [洛谷]P3371 单源最短路径模板 SPFA
- luoguP3371【模板】单源最短路径(Dijkstra+优先队列优化)
- 洛谷 P3371 【模板】单源最短路径(Dijkstra + 堆优化)
- 洛谷 P3371 【模板】单源最短路径
- 洛谷 P3371 【模板】单源最短路径
- [洛谷]P3371 单源最短路径模板-bell
- 洛谷 P3371 【模板】单源最短路径
- [洛谷]P3371 单源最短路径模板 Dijkstra
- 洛谷 P3371 【模板】单源最短路径
- 洛谷 P3371 [模版] 单源最短路径
- 最短路径——迪杰斯坷垃算法(有向图、单源最短路径)
- 最小生成树算法和单源最短路径算法
- 【算法导论】单源最短路径之Bellman-Ford算法
- sicily1031-Campus(单源最短路径dijkstra)