理想路径(Ideal Path,UVa 1599)
来源:互联网 发布:优惠券系统源码 编辑:程序博客网 时间:2024/04/28 15:41
题意:给一个n个点m条边(2 <= n <= 100000,1 <= m <= 200000)的无向图,每条边上都涂有一种一种颜色。求从结点1到结点n的一条路径,使得经过的变数尽量少,在此前提下,经过边的颜色序列的字典序最小。一对结点间可能有多条边,一条边可能连接两个相同的结点。输入保证节点1可以达到结点n。颜色为1-10^9的整数
分析:两次BFS,第一次从结点n逆向BFS,得到每个节点i到结点n的最短距离step[i],之后再从结点1正向BFS,每次到达一个新节点时保证step的值恰好减少1,如果有多种走法,则选择颜色字典序最小的走;若存在多条相同边,则一同压入队列进行判断,直至到结点n。
PS: 邻接表真的是个好东西啊
参考代码
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<string>#include<map>#include<sstream>#include<queue>#include<cctype>using namespace std;#define MAX 100001vector<int> g[MAX];vector<int> c[MAX*2];int ans[MAX];int step[MAX];int vis[MAX];queue<int> q;void bfs1(int n) { step[n] = 0; while(!q.empty()) q.pop(); q.push(n); while(!q.empty()) { int u = q.front(); q.pop(); int size = g[u].size(); for(int v=0;v<size;v++) { int vv = g[u][v]; int s = step[u] + 1; if(vv == 1) { step[1] = s; return; } if(step[vv] == -1) { step[vv] = s; q.push(vv); } } }}void bfs2() { while(!q.empty()) q.pop(); q.push(1); memset(vis,0,sizeof(vis)); while(!q.empty()) { int u = q.front(); q.pop(); int mi = -1; int size = g[u].size(); for(int v=0;v<size;v++) { int vv = g[u][v]; if(step[vv] == step[u] - 1) if(mi == -1) mi = c[u][v]; else mi = min(mi,c[u][v]); } if(ans[step[1]-step[u]] == 0) ans[step[1]-step[u]] = mi; else ans[step[1]-step[u]] = min(mi,ans[step[1]-step[u]]); for(int v=0;v<size;v++) { int vv = g[u][v]; if(!vis[vv] && step[vv] == step[u] - 1 && c[u][v] == mi) { q.push(vv); vis[vv] = 1; } } }}int main() { int n,m; while(~scanf("%d%d",&n,&m) && (n || m)) { for(int i=0;i<MAX;i++) { g[i].clear(); c[i].clear(); } while(m--) { int a,b,c1; scanf("%d%d%d",&a,&b,&c1); if(a == b) continue; g[a].push_back(b); g[b].push_back(a); c[a].push_back(c1); c[b].push_back(c1); } memset(ans,0,sizeof(ans)); memset(step,-1,sizeof(step)); bfs1(n); bfs2(); printf("%d\n",step[1]); for(int i=0;i<step[1];i++) i != step[1] - 1 ? printf("%d ",ans[i]) : printf("%d\n",ans[i]); } return 0;}
0 0
- 理想路径(Ideal Path,UVa 1599)
- UVA 1599 Ideal Path (理想路径)
- 例题6-20 UVA 1599 Ideal Path理想路径
- uva 1599 - Ideal Path
- UVa 1599 Ideal Path
- Uva - 1599 - Ideal Path
- UVa 1599 Ideal Path
- UVa 1599 Ideal Path
- UVA 1599 Ideal Path
- uva UVA - 1599 Ideal Path
- UVA 1599(p173)----Ideal Path
- UVa 1599 - Ideal Path <两次BFS>
- UVa 1599 - Ideal Path(BFS)
- UVa 1599 Ideal Path[待AC]
- ACM篇:UVa 1599 -- Ideal Path
- uva 1599 Ideal Path (两次bfs)
- Ideal Path UVA
- Ideal Path UVA
- 在Canvas上显示动画
- ReentrantLock与Condition
- git_community_book:ch2_basic_usage
- Android 打开闪光灯关键代码-转载
- LightOJ - 1206 Scheduling Taxi Cabs (二分图)
- 理想路径(Ideal Path,UVa 1599)
- 10004---Java多线程
- git_community_book_notes:ch3_junior_usage
- 推荐一个好的代码下载网站
- Char, String 和 Byte 等类型间的转换和编码
- Shiro使用和源码分析---4
- 第4讲 项目2----第二小节 求它们并联后的阻值R
- IOS UILabel
- Spring与CXF整合