codeforces 689B Mike and Shortcuts 最短路
生活随笔
收集整理的這篇文章主要介紹了
codeforces 689B Mike and Shortcuts 最短路
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目大意:給出n個(gè)點(diǎn),兩點(diǎn)間的常規(guī)路為雙向路,路長(zhǎng)為兩點(diǎn)之間的差的絕對(duì)值,第二行為捷徑,捷徑為單向路(第i個(gè)點(diǎn)到ai點(diǎn)),距離為1。問1到各個(gè)點(diǎn)之間的最短距離。
題目思路:SPFA求最短路
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0x3f3f3f3f #define MAX 1000005 #define Temp 1000000000 #define MOD 1000000007using namespace std;int a[MAX],vis[MAX],dist[MAX],n,k;struct node {int u,v,w,next; }G[MAX];void Add(int u,int v,int w) {G[k].u=u;G[k].v=v;G[k].w=w;G[k].next=a[u];a[u]=k++; }void SPFA() {queue<int>Q;int st=1;vis[1]=1;dist[1]=0;Q.push(st);while(!Q.empty()){st=Q.front();Q.pop();vis[st]=0;for(int i=a[st];i!=-1;i=G[i].next){int v=G[i].v;if(dist[v] > dist[st]+G[i].w){dist[v]=dist[st]+G[i].w;if(!vis[v]){vis[v]=1;Q.push(v);}}}} }int main() {int q;while(scanf("%d",&n)!=EOF){k=0;memset(a,-1,sizeof(a));memset(vis,0,sizeof(vis));memset(dist,INF,sizeof(dist));for(int i=1;i<=n;i++){Add(i,i+1,1);Add(i+1,i,1);}for(int i=1;i<=n;i++){scanf("%d",&q);Add(i,q,1);}SPFA();for(int i=1;i<=n;i++)printf("%d%c",dist[i],i==n?'\n':' ');}return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/alan-W/p/5997029.html
總結(jié)
以上是生活随笔為你收集整理的codeforces 689B Mike and Shortcuts 最短路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从上往下打印出二叉树的每个节点,同层节点
- 下一篇: 【BZOJ-1127】KUP 悬