说实话,这题参考的:

http://blog.csdn.net/u013382399/article/details/38227917

倒着BFS就把我难住了T T,原来这样倒着BFS一遍,遍历完所有的点后就能得到每一点到终点的最短距离啊(其实做完反思后仔细想了想,发现其实当第一次bfs到首节点时,该图已经遍历完成了),一开始没转过这个弯来T T,我直接调用了N次dfs(i)囧rz....

一开始我还想着吧color[]排序...这样更费时.....我写的dfs2()写着写着就乱了,本来思路还清晰,结果越写越乱T T...然后直接看的他的dfs2()

哎,和人家还有很大差距啊......虽然几乎是直接copy的人家的代码,但是做了深刻的反思,也深度的学习了他的代码与方法,算是学到了一些东西吧, 嘻嘻……至少比自己空领悟节约点时间嘛

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define maxn 100000+5
using namespace std;
vector<int> g[maxn];
vector<int> c[maxn];
int n,m,vis[maxn],d[maxn],ans[maxn];
int init(){
int x,y;
int temp;
memset(vis,,sizeof(vis));
memset(d,,sizeof(d));
memset(ans,,sizeof(ans));
for (int i=;i<=n;i++)g[i].clear();
for (int i=;i<=n;i++)c[i].clear();
for (int i=;i<m;i++){
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
cin>>temp;
c[x].push_back(temp);
c[y].push_back(temp);
}
}
void bfs1(int n)
{
memset(d,-,sizeof(d));
queue<int> q;
d[n]=;
q.push(n);
while(!q.empty())
{
int u=q.front();q.pop();
int sz=g[u].size();
for(int v=;v<sz;v++)
{
int vv=g[u][v];
if(vv==)
{
d[]=d[u]+;
return;
}
if(d[vv]==-)
{
d[vv]=d[u]+;
q.push(vv);
}
}
}
return;
}
void bfs2()
{
memset(vis,,sizeof(vis));
queue<int> q;
q.push();
while(!q.empty())
{
int u=q.front();q.pop();
if(d[u]==) return;
int sz=g[u].size();
int mm=-;
for(int i=;i<sz;i++)//找到最小的颜色
{
int vv=g[u][i];
if(d[vv]==d[u]-)
{
if(mm==-)
mm=c[u][i];
else
mm=min(mm,c[u][i]);
}
}
int t=d[]-d[u];
if(ans[t]==) ans[t]=mm;
else
ans[t]=min(mm,ans[t]);
for(int v=;v<sz;v++)
{
int vv=g[u][v];
if(vis[vv]==&&d[vv]==d[u]-&&c[u][v]==mm)
{
q.push(vv);
vis[vv]=;
}
}
}
return;
}
int main()
{
while (cin>>n>>m){
init();
bfs1(n);
bfs2();
printf("%d\n",d[]);
for(int i=;i<d[];i++)
{
if(i) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
}

UVa1599,Ideal Path的更多相关文章

  1. UVa1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

    题目大意: 对于一个n个房间m条路径的迷宫(Labyrinth)(2<=n<=100000, 1<=m<=200000),每条路径上都涂有颜色,颜色取值范围为1<=c&l ...

  2. UVA-1599 Ideal Path(双向BFS)

    题目: 给一个n个点m条边(2≤m≤100000, 1≤m≤200000)的无向图,每条边上都涂有一种颜色(用1到1000000000表示).求从结点1到结点n的一条路径, 使得经过的边数尽量少,在此 ...

  3. 6-20 Ideal Path uva1599

    第一个bfs很快  但是我第一次做还用了结构体  这题完全不需要  反而导致了代码非常乱 输入: 一开始我是用m二维数组储存颜色  vector path来储存路径 但是二维数组的下标是不够用的   ...

  4. 【例题 6-20 UVA - 1599】Ideal Path

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 逆向做一遍bfs. 得到终点到某个点的最短距离. 这样,我们从起点顺序的时候. 就能知道最短路的下一步是要走哪里了. 这样,我们从起 ...

  5. UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

    https://vjudge.net/problem/UVA-1599 给一个n个点m条边(2<=n<=100000,1<=m<=200000)的无向图,每条边上都涂有一种颜色 ...

  6. uva 1599 ideal path(好题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGYAAAODCAYAAAD+ZwdMAAAgAElEQVR4nOy9L8/0ypH/Pa8givGiyC

  7. UVa 1599 (字典序最小的最短路) Ideal Path

    题意: 给出一个图(图中可能含平行边,可能含环),每条边有一个颜色标号.在从节点1到节点n的最短路的前提下,找到一条字典序最小的路径. 分析: 首先从节点n到节点1倒着BFS一次,算出每个节点到节点n ...

  8. UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)

    给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...

  9. UVA 1599 Ideal Path (HDU 3760)

    两次bfs: 第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路:第二次bfs根据最短距离可以选择满足条件的最短路. 注意!碰到这种很大数据量的题目一定要记得用scanf,printf 输入 ...

随机推荐

  1. 201521123001《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: XMind 答: 大多数情况下,从性能上来说ArrayList最好,但是当集合内的元素需要频繁插入.删除时Lin ...

  2. 201521123015 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  3. 201521123108 《Java程序设计》第2周学习总结

    1. 本章学习总结 学习了java的知识,虽然还不是太懂,以后一定会取得进步的 2. 书面作业 Q1. 使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)? 答: Q2. 为什 ...

  4. 201521123038 《Java程序设计》 第十一周学习总结

    201521123038 <Java程序设计> 第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多 ...

  5. 201521123062《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现 ...

  6. Fabric 1.0的多机部署

    Fabric1.0已经正式发布一段时间了,官方给出的单机部署的脚本也很完备,基本上傻瓜式的一键部署,直接运行官方的network_setup.sh up即可.但是在实际生产环境,我们不可能把所有的节点 ...

  7. Hibernate由model类自动同步数据库表结构

    在开发中遇到了个问题,每次测试数据库增加表结构的时候,本地pull下最新代码导致启动报错,上网搜了快速解决办法---->hibernate 配置属性中,hibernate.hbm2ddl.aut ...

  8. mysql水平分表和垂直分表的优缺点

    表分割有两种方式: 1.水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用. •表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数 ...

  9. [AHOI2001]质数和分解

    [AHOI2001]质数和分解 题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形 ...

  10. Linux学习——shell编程之变量

    shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...