晚点补题解
#include <bits/stdc++.h>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 200005;
int head[MAXN],dis[MAXN];
int look[MAXN];//vis
int n,m,cas,ans;
int u,v,w;
queue <int> q;
struct Edge {
int u,v,w,next,vis;
void set(int u, int v, int w) {
this->u = u;
this->v = v;
this->w = w;
}
} edge[MAXN<<2];
void addEdge(int u, int v, int w) {
edge[cas].set(u,v,w);
edge[cas].next = head[u];
edge[cas].vis = 0;
head[u] = cas++;
}
void dfs(int rt, int cl, int num) {
int i, j;
if(rt == n) {
ans = num;
return;
}
if(!look[rt]) {
look[rt] = 1;
dis[rt] = num;
q.push(rt);
}
for(i = head[rt]; i != -1; i = edge[i].next) {
if(edge[i].vis) continue;
if(edge[i].w == cl) {
edge[i].vis = 1;
dfs(edge[i].v,cl,num);
}
}
return;
}
int bfs() {
while(!q.empty()) q.pop();
q.push(1);
dis[1] = 0;
look[1] = 1;
while(!q.empty()) {
int now = q.front();
q.pop();
for(int i = head[now]; i != -1; i = edge[i].next) {
if(edge[i].vis) continue;
v = edge[i].v;
edge[i].vis = 1;
dfs(v,edge[i].w,dis[now]+1);
if(ans>0) break;
}
if(ans > 0) break;
}
return ans;
}
int main() {
while(~scanf("%d%d",&n,&m)) {
cas = 0;
memset(head, -1, sizeof(head));
memset(look, 0, sizeof(look));
memset(dis, INF, sizeof(dis));
for(int i = 1; i <= m; i++) {
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
ans = -1;
ans = bfs();
printf("%d\n",ans);
}
return 0;
}