仿照刘汝佳的代码用vector却超时。。。
只能自己再写一个用队列实现的。。
而且还要注意这个地方要vis数组。。(按理说应该知道走过的路自然不会再走啊。。 不懂。。。。)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
int n,m;
int tol;
const int maxn=100000 + 5;
struct Edge{
int v,nxt,w;
}edge[maxn*4];
int head[maxn];
int vis[maxn];
int d[maxn];
void addedge(int u,int v,int w){
edge[tol].v=v;
edge[tol].w=w;
edge[tol].nxt=head[u];
head[u]=tol++;
}
void rev_bfs(){
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
queue<int>que;
que.push(n);
vis[n]=1;
d[n]=0;
while(!que.empty()){
int u=que.front();que.pop();
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].v;
if(vis[v])continue;
vis[v]=1;
d[v]=d[u]+1;
que.push(v);
}
}
}
vector<int>ans;
void bfs(){
memset(vis,0,sizeof(vis));
ans.clear();
queue<int >que;
queue<int >que2;
queue<int>tmp;
queue<int>tmp1;
que.push(1);
vis[1]=1;
while(!que.empty()){
int min_color=INF;
while(!que.empty()){
int t=que.front();que.pop();
tmp.push(t);
tmp1.push(t);//一分为二,第一个是用来找min_color的,第二个就是用来走下一个节点的
}
while(!tmp.empty()){
int u=tmp.front();tmp.pop();
if(u==n)break;
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].v;
if(d[v]==d[u]-1){
min_color=min(min_color,edge[i].w);
}
}
}
ans.push_back(min_color);
while(!tmp1.empty()){
int u=tmp1.front();tmp1.pop();
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].v;
if(d[v]==d[u]-1&&!vis[v]&&edge[i].w==min_color){
if(v==n)return;
vis[v]=1;
que2.push(v);
}
}
}
if(que.empty()){
while(!que2.empty()){
int t=que2.front();que2.pop();
que.push(t);
}
}
}
}
int main(){
while(scanf("%d%d", &n, &m) == 2){
tol=0;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
rev_bfs();
bfs();
printf("%d\n", ans.size());
printf("%d", ans[0]);
for(int i = 1; i < ans.size(); i++) printf(" %d", ans[i]);
printf("\n");
}
}