洛谷p2296寻找道路
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
const int INF=0x3f3f3f3f;
struct Node{
int v,w;
Node(int _v,int _w){
v=_v;
w=_w;
}
};
int n,m,a,b,s,t,d[maxn],vis[maxn],bj[maxn];
vector<Node>g[maxn];vector<Node>f[maxn];
void dij(int x){
memset(d,INF,sizeof(d));
d[x]=0;
for(int i=1;i<=n;i++){
int u=-1,minu=INF;
for(int j=1;j<=n;j++)
if(!vis[j]&&d[j]<minu)
u=j,minu=d[j];
if(u==-1)return ;
vis[u]=1;
for(int j=0;j<g[u].size();j++){
int t=g[u][j].v;
if( !vis[t]&&d[u]+g[u][j].w<d[t])
d[t]=d[u]+g[u][j].w;
}
}
}
void dij2(int x){
memset(d,INF,sizeof(d));
d[x]=0;
for(int i=1;i<=n;i++){
int u=-1,minu=INF;
for(int j=1;j<=n;j++)
if(!vis[j]&&d[j]<minu)
u=j,minu=d[j];
if(u==-1)return ;
vis[u]=1;
for(int j=0;j<f[u].size();j++){
int t=f[u][j].v;
if(!vis[t]&&d[u]+f[u][j].w<d[t])
d[t]=d[u]+f[u][j].w;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
g[a].push_back(Node(b,1));
f[b].push_back(Node(a,1));
}
cin>>s>>t;
dij2(t);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
if(d[i]==INF)
for(int j=0;j<f[i].size();j++)
vis[f[i][j].v]=1;
dij(s);
if(d[t]==INF)cout<<"-1"<<endl;
else cout<<d[t]<<endl;
return 0;
}
洛谷p1135奇怪的电梯
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000;
const int INF=0x3f3f3f3f;
struct Node{
int v,w;
Node(int _v,int _w){
v=_v;
w=_w;
}
};
int n,a,b,k,d[maxn],vis[maxn];
vector<Node>g[maxn];
void dij(int x){
memset(d,INF,sizeof(d));
d[x]=0;
for(int i=1;i<=n;i++){
int u=-1,minu=INF;
for(int j=1;j<=n;j++)
if(!vis[j]&&d[j]<minu)
u=j,minu=d[j];
if(u==-1)return ;
vis[u]=1;
for(int j=0;j<g[u].size();j++){
int t=g[u][j].v;
if(!vis[t]&&d[u]+g[u][j].w<d[t])
d[t]=d[u]+g[u][j].w;
}
}
}
int main(){
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>k;
if(i+k<=n&&k!=0)g[i].push_back(Node(i+k,1));
if(i-k>0&&k!=0)g[i].push_back(Node(i-k,1));
}
dij(a);
if(d[b]==INF)cout<<"-1"<<endl;
else cout<<d[b]<<endl;
return 0;
}