Uva - 1599 - Ideal Path
来源:互联网 发布:飞控编程用什么 编辑:程序博客网 时间:2024/04/25 20:01
先倒着BFS,找到每个结点i到重点最短距离d[i],然后直接起点开始BFS,如果有多种走法,选颜色字典序最小的走。
AC代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <cctype>#include <cstring>#include <string>#include <sstream>#include <vector>#include <set>#include <map>#include <algorithm>#include <stack>#include <queue>#include <bitset> #include <cassert> using namespace std;const int maxn = 100005;const int maxc = 1000000000;struct Edge {int u, v, c;Edge(int u = 0, int v = 0, int c = 0) : u(u), v(v), c(c) {}};vector<Edge> edges;vector<int> G[maxn];void addEdge(int u, int v, int c){edges.push_back(Edge(u, v, c));int idx = edges.size() - 1;G[u].push_back(idx);}int n, vis[maxn];int d[maxn]; // 每个结点i到重点的最短距离d[i]// 从终点倒着BFS,找到到达n-1的最短路void revBfs(){memset(vis, 0, sizeof(vis));d[n - 1] = 0;vis[n - 1] = true; // 访问状态queue<int> q;q.push(n - 1);while (!q.empty()) {int v = q.front();q.pop();for (int i = 0; i < G[v].size(); i++) {int e = G[v][i];int u = edges[e].v;if (!vis[u]) { // 还没有杯访问过vis[u] = true;d[u] = d[v] + 1;q.push(u);}}}}vector<int> ans;// 从起点开始BFS,如果有多种走法,选颜色字典序最小的走void bfs(){memset(vis, 0, sizeof(vis));vis[0] = true;ans.clear();vector<int> next;next.push_back(0);for (int i = 0; i < d[0]; i++) {int minColor = maxc;for (int j = 0; j < next.size(); j++) {int u = next[j];for (int k = 0; k < G[u].size(); k++) {int e = G[u][k];int v = edges[e].v;if (d[u] == d[v] + 1) {minColor = min(minColor, edges[e].c);}}}ans.push_back(minColor);// 再一次BFSvector<int> next2;for (int j = 0; j < next.size(); j++) {int u = next[j];for (int k = 0; k < G[u].size(); k++) {int e = G[u][k];int v = edges[e].v;if (d[u] == d[v] + 1 &&!vis[v] &&edges[e].c == minColor) {vis[v] = true;next2.push_back(v);}}}next = next2;}printf("%d\n", ans.size());printf("%d", ans[0]);for (int i = 1; i < ans.size(); i++) {printf(" %d", ans[i]);}printf("\n");}int main(){int u, v, c, m;while (scanf("%d%d", &n, &m) == 2) {edges.size();for (int i = 0; i < n; i++) {G[i].clear();}while (m--) {scanf("%d%d%d", &u, &v, &c);addEdge(u - 1, v - 1, c);addEdge(v - 1, u - 1, c);}revBfs();bfs();}return 0;}
0 0
- 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)
- 理想路径(Ideal Path,UVa 1599)
- UVa 1599 Ideal Path[待AC]
- UVA 1599 Ideal Path (理想路径)
- ACM篇:UVa 1599 -- Ideal Path
- uva 1599 Ideal Path (两次bfs)
- Ideal Path UVA
- Ideal Path UVA
- Ideal Path UVA
- JavaWeb学习总结
- android启动渐变效果,左至右消失
- CAD控件:自定义实体的实现
- JS实现密码加密(base64, md5, sha1)
- 查询字段要来自多个字段CopyField
- Uva - 1599 - Ideal Path
- echar饼状图在区域名字后显示值及其百分比
- SAT英文阅读扩展(2):What is Poetry
- Android Uevent使用
- SVN配置说明
- Java之Json
- Mybaits的resultMap详解
- 《C++编程规范-101条规则 准则与最佳实践》读书笔记
- AIX make概述 Dependency line needs colon or double colon operator