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; }
相关文章推荐
- UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)
- 例题6-20 UVa1599 Ideal Path(两次BFS)
- UVa 1599 - Ideal Path(BFS)
- UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)
- UVa 1599 (字典序最小的最短路) Ideal Path
- uva1599 bfs双向遍历 利用数组保存中间结果
- UVa 1599 Ideal Path (两次BFS)
- UVa1599 Ideal Path(双向bfs+队列判重)
- UVa 1599 Ideal Path【BFS】
- uva 1599 Ideal Path (两次bfs)
- 例题6-20 uva1599 Ideal Path (双向bfs+字典序)
- UVa1599 - Ideal Path
- UVa 1599 Ideal Path
- uva 1601万圣节后的早晨 双向bfs
- UVa1599,Ideal Path
- UVa524 例题7-9 万圣节后的早晨 (单向+双向)BFS
- UVA 816 Abbott's Revenge BFS求最短路+路径输出(详细注释)
- UVa 704 - Colour Hash, 双向bfs,很给力
- UVa1601 - The Morning after Halloween(单向+双向BFS)