1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for(int i=(a);i<(n);i++) #define per(i,a,n) for(int i=(n-1);i>=(a);i--) #define fi first #define se second typedef pair <int,int> pII; typedef long long ll; const int INF = 0x3f3f3f3f;
void read(int &x){ char ch = getchar();x = 0; for (; ch < '0' || ch > '9'; ch = getchar()); for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; } const int maxn = 1e5 + 10; int n,m,ans,cnt; int head[maxn],dis[maxn<<1]; struct Edge{ int to,next,idx; }G[maxn<<2]; void add(int u,int v,int id){ G[cnt].to = v; G[cnt].next = head[u]; G[cnt].idx = id; head[u] = cnt++; } deque<int> q; void bfs(){ for(int i = head[1];~i;i=G[i].next) dis[i/2] = 1,q.push_back(i/2); while(!q.empty()){ int now = q.front(); q.pop_front(); for(int i = head[G[now*2].to];~i;i=G[i].next){ if(G[i].idx == G[now*2].idx){ if(dis[i/2] > dis[now]){ dis[i/2] = dis[now];q.push_front(i/2); } }else{ if(dis[i/2] > dis[now] + 1){ dis[i/2] = dis[now]+1;q.push_back(i/2); } } } for(int i = head[G[now*2+1].to];~i;i=G[i].next){ if(G[i].idx == G[now*2+1].idx){ if(dis[i/2] > dis[now]){ dis[i/2] = dis[now];q.push_front(i/2); } }else{ if(dis[i/2] > dis[now]+1){ dis[i/2] = dis[now]+1;q.push_back(i/2); } } } } ans = INF; for(int i = head[n];~i;i=G[i].next){ if(ans > dis[i/2]) ans = dis[i/2]; } } int main(){ #ifdef LOCAL freopen("a.in","r",stdin); #endif while(~scanf("%d%d",&n,&m)){ memset(head,-1,sizeof(int)*(n+2));cnt = 0; rep(i,0,m+2) dis[i] = INF; rep(i,0,m){ int u,v,id;read(u);read(v);read(id); add(u,v,id);add(v,u,id); } bfs(); printf("%d\n",ans==INF?-1:ans); } return 0; }
|