UVA 1599 Ideal Path【双向bfs+非简单图的最短路】
来源:互联网 发布:python decoding 编辑:程序博客网 时间:2024/04/24 03:23
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;}
阅读全文
0 0
- UVA 1599 Ideal Path【双向bfs+非简单图的最短路】
- HDU 3760 Ideal Path 最短路+BFS
- HDU 3760 Ideal Path 最短路spfa+BFS 字典序最小的最短路
- UVa 1599 - Ideal Path <两次BFS>
- UVa 1599 - Ideal Path(BFS)
- uva 1599 Ideal Path (两次bfs)
- [bfs 分层图 字典序 最短路] BZOJ 2644 Pku3967 Ideal Path
- 最短路+字典序最小+输出路径(Ideal Path,UVA 1599)
- uva 1599 - Ideal Path
- UVa 1599 Ideal Path
- Uva - 1599 - Ideal Path
- UVa 1599 Ideal Path
- UVa 1599 Ideal Path
- UVA 1599 Ideal Path
- hdu 3760 Ideal Path 字典序最小的最短路
- UVA 1599 Ideal Path 【两次BFS+贪心】 (好题)
- uva UVA - 1599 Ideal Path
- UVA 1599(p173)----Ideal Path
- oracle中varchar和char的区别
- (转载)JSP的基础语法【一】
- 常见面试数据库优化
- javascript 获取HTML DOM对象五种方式
- idea快捷键
- UVA 1599 Ideal Path【双向bfs+非简单图的最短路】
- EffectiveJava(笔记六) 方法
- (33)多态中成员的特点
- java 中如何避免多线程不安全
- JAVA spring+jcrop.js实现简单的头像剪裁
- 什么是CRM?
- OpenCV图像处理算法——开篇(一)
- jzoj1301 treecut
- mybatis学习知识点摘录