题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小

紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离,

第二次bfs从起点沿着每到达一个节点d[]减少1来走,按照颜色的字典序最小的路径来走

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = ;
const int mod=;
const int maxn=; struct Edge{
int u,v,c;
Edge(int u=,int v=,int c=):u(u),v(v),c(c){}
}; vector<Edge> edges;
vector<int> G[maxn]; void addedges(int u,int v,int c){
edges.push_back(Edge(u,v,c));
int idx=edges.size()-;
G[u].push_back(idx);
} int n,vis[maxn],d[maxn]; void rev_bfs(){//求出每一个节点到终点n-1的距离
memset(vis,,sizeof(vis));
vis[n-]=true;
d[n-]=; queue<int> q;
q.push(n-);
while(!q.empty()){
int v=q.front();q.pop();
for(int i=;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]+;
q.push(u);
}
}
}
} vector<int> ans; void bfs(){
memset(vis,,sizeof(vis));
vis[]=true;
ans.clear(); vector<int> next;
next.push_back(); for(int i=;i<d[];i++){
int min_color=INF;
for(int j=;j<next.size();j++){
int u=next[j];
for(int k=;k<G[u].size();k++){
int e=G[u][k];
int v=edges[e].v;
if(d[u]==d[v]+)
min_color=min(min_color,edges[e].c);
}
} ans.push_back(min_color); vector<int> next2;
for(int j=;j<next.size();j++){
int u=next[j];
for(int k=;k<G[u].size();k++){
int e=G[u][k];
int v=edges[e].v;
if(d[u]==d[v]+&&edges[e].c==min_color&&!vis[v]) {
vis[v]=true;
next2.push_back(v);
}
}
}
next=next2;
} printf("%d\n",ans.size());
printf("%d",ans[]);
for(int i=;i<ans.size();i++) printf(" %d",ans[i]);
printf("\n");
} int main(){
int m,u,v,c;
while(scanf("%d %d",&n,&m)==){
edges.clear();
for(int i=;i<n;i++) G[i].clear(); while(m--){
scanf("%d %d %d",&u,&v,&c);
addedges(u-,v-,c);
addedges(v-,u-,c);
}
rev_bfs();
bfs();
}
return ;
}

这道题放了一个月,最后还是看的标程,艾---看来有些题目不是拖得越久就会了,,,,

不要懒的说啊----

加油--gooooooooooooo---

最新文章

  1. SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
  2. 利用pt-deadlock-logger监控死锁
  3. Android中JNI 的一些常用Method说明
  4. sessions 表的架构过程
  5. NodeManager起不来
  6. [Jobdu] 题目1527:首尾相连数组的最大子数组和
  7. CHS与LBA之间转换程序
  8. java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
  9. 什么是C# Lambda表达式?形如:p=&gt;p.abc
  10. Spring MVC视图层:thymeleaf vs. JSP
  11. vue的简单tab
  12. erlang在redhat上的安装
  13. 如何确保API的安全性
  14. HttpClient的巨坑
  15. wpf binging (六)多绑定
  16. eclipse哪个版本好
  17. 表格重新加载 where 携带上次值问题
  18. Android Studio 之 打包生成的 apk 安装包装到手机上闪退
  19. 使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling
  20. shell习题第4题:监控ip地址存活

热门文章

  1. [Struts2] No result defined for action ... and result input &amp;amp; Invalid field value for field ...
  2. POJ 1951 模拟
  3. Apache Ignite - 轉
  4. POJ 3067 Japan 【 树状数组 】
  5. 小巧的ssh客户端
  6. 关于vue事件监听的一个问题
  7. CloudStack云基础架构的一些概念
  8. C#调用带结构体指针的C Dll的方法
  9. UVA 11248 Frequency Hopping
  10. java 自定义实现base64编码转换