您的位置:首页 > 其它

UVa1599 Ideal Path(双向bfs+队列判重)

2018-02-09 02:04 435 查看
紫书上的一道例题,题目链接

做两次bfs,第一次记录可达n的点到n的距离,到点1为止

第二次 要在距离满足上一个点-1的基础上找边的最小值,这道题并不需要找到一条路径,只需要输出边的值即可,所以即便有多条边,也直接记录最小值就好了。

需要注意的一点,为了避免超时,需要加一个优化,用v数组来记录点是否被加入到队列中,即队列去重

#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rep1(i,a,b) for(int i=a;i>=b;i--)
#define rson rt<<1|1,m+1,r
#define lson rt<<1,l,m
using namespace std;
const int N=1e5+10;
int arr
,vis
,res
,v
;
struct node
{
int b,c;
};
vector<node>G
;
int main()
{
ios::sync_with_stdio(false);
int n,m;
while(cin>>n>>m)
{
memset(vis,0,sizeof vis);
memset(res,0,sizeof res);
memset(v,0,sizeof v);
for(int i=0;i<N;i++)
G[i].clear();
rep(i,0,m)
{
int a,b,c;
cin>>a>>b>>c;
G[a].pb({b,c});
G[b].pb({a,c});
}
queue<int>q;
q.push(n);
vis
=1;
while(!q.empty())
{
int a=q.front();
q.pop();
int pp=0;
rep(i,0,G[a].size())
{
node y=G[a][i];
if(!vis[y.b])
{
vis[y.b]=vis[a]+1;
q.push(y.b);
if(y.b==1)
{pp=1;break;}
}
}
if(pp) break;
}
while(!q.empty())
q.pop();

4000
q.push(1);
while(!q.empty())
{
int a=q.front();
q.pop();
int mi=inf,pp=0;
if(a==n)break;
rep(i,0,G[a].size())
{
node y=G[a][i];
if(vis[y.b]==vis[a]-1)
mi=min(y.c,mi);
}
rep(i,0,G[a].size())
{
node y=G[a][i];
if(!v[y.b]&&vis[y.b]==vis[a]-1&&y.c==mi)
{
q.push(y.b);
v[y.b]=1;
}
}
int index=vis[1]-vis[a];
if(res[index]==0)res[index]=mi;
else res[index]=min(res[index],mi);
}
cout<<vis[1]-1<<endl<<res[0];
rep(i,1,vis[1]-1)
cout<<' '<<res[i];
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs 队列