HDU 3760 Ideal Path (bfs,分层)
来源:互联网 发布:gta5捏脸贝克汉姆数据 编辑:程序博客网 时间:2024/05/01 01:45
HDU 3760 Ideal Path (bfs,分层)
此题的自环不存即可,重边都存起来,并不影响结果
分层的过程也可用bfs,但要注意取每层最小值时,取需取该层全部节点向下边值的最小值
#include<functional>#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#define REP(i, n) for(int i=0; i<n; i++)#define CLR(a, b) memset(a, b, sizeof(a))#define LL long longusing namespace std;const int INF = 0x3f3f3f3f;struct Edge { int u, v, c, next; bool vis; Edge(){} Edge(int u, int v, int c, bool vis, int next): u(u), v(v), c(c), vis(vis), next(next){}};int tot;Edge adj[100010 * 4];int head[100010];void add_edge(int u, int v, int c){ adj[tot] = Edge(u, v, c, false, head[u]); head[u] = tot++;}int d[100010];set<int>S[2];set<int>::iterator si;vector<int>ans;int n, m;void bfs(){ queue<int>q; while(!q.empty()) q.pop(); CLR(d, INF); d[n] = 0; q.push(n); while (!q.empty()) { int u = q.front(); q.pop(); for (int r = head[u]; ~r; r = adj[r].next) { int v = adj[r].v; if (d[v] > d[u] + 1) { d[v] = d[u] + 1; q.push(v); } } } printf("%d\n", d[1]);}void solve(){ bfs(); int now = 0, next; REP(i, 2) S[i].clear(); S[0].insert(1); ans.clear(); int step = d[1]; while (step) { next = now ^ 1; int smin = INF; for (si = S[now].begin(); si != S[now].end(); si++) { int u = (*si); for (int r = head[u]; ~r; r = adj[r].next) { int v = adj[r].v; if (d[v] == step - 1 && smin > adj[r].c) smin = adj[r].c; } } ans.push_back(smin); for (si = S[now].begin(); si != S[now].end(); si++) { int u = (*si); for (int r = head[u]; ~r; r = adj[r].next) { int v = adj[r].v; if (d[v] == step - 1 && smin == adj[r].c) S[next].insert(v); } } S[now].clear(); now ^= 1; step--; } REP(i, ans.size()) { if (i) printf(" "); printf("%d", ans[i]); } printf("\n");}int main(){ int x, y, z; int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); CLR(head, -1); tot = 0; REP(i, m) { scanf("%d%d%d", &x, &y, &z); if (x == y) continue; add_edge(x, y, z); add_edge(y, x, z); } solve(); }}/*126 61 3 13 5 15 6 21 2 12 4 24 6 1*/
#include<functional>#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#define REP(i, n) for(int i=0; i<n; i++)#define CLR(a, b) memset(a, b, sizeof(a))#define LL long longusing namespace std;const int INF = 0x3f3f3f3f;struct Edge { int u, v, c, next; bool vis; Edge(){} Edge(int u, int v, int c, bool vis, int next): u(u), v(v), c(c), vis(vis), next(next){}};int tot;Edge adj[100010 * 4];int head[100010];void add_edge(int u, int v, int c){ adj[tot] = Edge(u, v, c, false, head[u]);/// head[u] = tot++;}int d[100010];set<int>S[2];set<int>::iterator si;vector<int>ans;int n, m;void bfs(){ queue<int>q; while(!q.empty()) q.pop(); CLR(d, INF); d[n] = 0; q.push(n); while (!q.empty()) { int u = q.front(); q.pop(); for (int r = head[u]; ~r; r = adj[r].next) { int v = adj[r].v; if (d[v] >= d[u] + 1) { if (d[v] > d[u] + 1) q.push(v); d[v] = d[u] + 1; adj[r ^ 1].vis = true; /// } } } printf("%d\n", d[1]);}void solve(){ bfs(); int now = 0, next; REP(i, 2) S[i].clear(); S[0].insert(1); ans.clear(); int step = d[1]; while (step) { next = now ^ 1; int smin = INF; for (si = S[now].begin(); si != S[now].end(); si++) { int u = (*si); for (int r = head[u]; ~r; r = adj[r].next) { int v = adj[r].v; if (adj[r].vis && smin > adj[r].c)/// smin = adj[r].c; } } ans.push_back(smin); for (si = S[now].begin(); si != S[now].end(); si++) { int u = (*si); for (int r = head[u]; ~r; r = adj[r].next) { int v = adj[r].v; if (adj[r].vis && smin == adj[r].c)/// S[next].insert(v); } } S[now].clear(); now ^= 1; step--; } REP(i, ans.size()) { if (i) printf(" "); printf("%d", ans[i]); } printf("\n");}int main(){ int x, y, z; int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); CLR(head, -1); tot = 0; REP(i, m) { scanf("%d%d%d", &x, &y, &z); if (x == y) continue; add_edge(x, y, z); add_edge(y, x, z); } solve(); }}/*126 61 3 13 5 15 6 21 2 12 4 24 6 1*/
- HDU 3760 Ideal Path (bfs,分层)
- HDU 3760-Ideal Path bfs
- HDU 3760 Ideal Path 最短路+BFS
- HDU 3760 Ideal Path
- HDU 3760 Ideal Path 最短路spfa+BFS 字典序最小的最短路
- [bfs 分层图 字典序 最短路] BZOJ 2644 Pku3967 Ideal Path
- HDOJ 3760: Ideal Path
- UVa 1599 - Ideal Path <两次BFS>
- UVa 1599 - Ideal Path(BFS)
- HDU3760 Ideal Path 逆bfs+贪心
- uva 1599 Ideal Path (两次bfs)
- hdu 3760 Ideal Path 字典序最小的最短路
- 例题6-20 UVa1599 Ideal Path(两次BFS)
- UVA 1599 Ideal Path 【两次BFS+贪心】 (好题)
- Ideal Path,uva1599/hdu 3760(最短路中字典序最小的路径)
- 1599 - Ideal Path
- uva 1599 - Ideal Path
- 1599 - Ideal Path
- C++优先队列的基本使用方法
- 个人作品”可米录音机“上线啦,自己激动一下下
- Spring入门
- noip2013题解 普及组
- vsftpd配置只允许从某个主机访问
- HDU 3760 Ideal Path (bfs,分层)
- mysql 事务简介
- Collection与Collections
- javascript 介绍
- java学习之路----java类库----Arrays对对象的排序---二叉树实现原理
- memcached完全剖析之五
- 配置 Hmail Squirrel Mail windows mssql
- PowerDesigner使用教程
- 扑克游戏-砸金花--java语言--骆昊