您的位置:首页 > 其它

UVA 1599 Ideal Path【双向bfs+非简单图的最短路】

2017-07-09 21:26 399 查看


Ideal Path

 UVA - 1599 思路:从终点开始倒着bfs一次,得到每个点到终点的距离,然后从起点开始,按照每次距离减1的方法寻找接下来的点的编号。按照颜色最小的走,如果有多个颜色最小,则都拉入队列中,将最小的颜色记录在res数组中。细节:已经进入队列的节点不能重复入队,否则复杂度太高,会tle(重复入队的复杂度至少是O(n^2),在n=100000的情况下直接tle)第一次bfs和第二次bfs的终止时机不同,第一次找到起点就终止,第二次则是从队列中取出节点时才能终止,为的是遍历完所有导向终点且路径长度一致的边,只有这样才能结果正确d数组记录每个节点到终点n的距离,不能用0进行初始化,而终点处的初始化必须
in数组和vis数组表示的状态不同,在正向搜索中,in过的也需要判断是否存在更小的minc(颜色值)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define ll long long
#define ms(a,b)  memset(a,b,sizeof(a))
const int M=1e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int i,j,k,n,m;
typedef struct node
{
int num;
int col;
}v;
int d[M],res[M];
bool vis[M],in[M];
vector<v>e[M];

void bfs1(int st)
{
queue<int>q;
q.push(st);
ms(vis,0);
ms(in,0);
for(int i=1;i<=n;i++)d[i]=-1;
d[st]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=1;
for(int i=0;i<e[u].size();i++){
int uu=e[u][i].num;
if(!vis[uu]){
d[uu]=d[u]+1;
q.push(uu);
vis[uu]=1;
}
}
}
}
void bfs2(int st)
{
queue<int>q;
ms(vis,0);
q.push(st);
ms(res,0);
ms(in,0);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=1;
int minc=inf;
for(int i=0;i<e[u].size();i++){
int uu=e[u][i].num;
if(!vis[uu]&&d[uu]==d[u]-1)
minc=min(minc,e[u][i].col);
}
for(int i=0;i<e[u].size();i++){
int uu=e[u][i].num;
if(!vis[uu]&&!in[uu]&&(d[uu]==d[u]-1)&&e[u][i].col==minc){
q.push(uu);
in[uu]=1;
}
}
int xx=d[1]-d[u];
if(res[xx]==0)res[xx]=minc;
else res[xx]=min(res[xx],minc);
}
}

int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<=n;i++)e[i].clear();
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
node v;
v.num=b;v.col=c;
if(a==b)continue;
e[a].push_back(v);
v.num=a;
e[b].push_back(v);
}
bfs1(n);
bfs2(1);
printf("%d\n%d",d[1],res[0]);
for(int i=1;i<d[1];i++)
printf(" %d",res[i]);
printf("\n");
}
return 0;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: