用队列维护,对于每块颜色相同的相连的边进行dfs并记录即可
注意这题要用vis来标记边,不可以标记点
因为点的深度是可以随时更新的(这样的做法不满足贪心条件)
#include<bits/stdc++.h> using namespace std; #define maxn 200005 #define INF 0x3f3f3f3f struct Edge{ int to,nxt,w,flag; }edge[maxn<<1]; int head[maxn],tot,n,m; void init(){memset(head,-1,sizeof head);tot=0;} void add(int u,int v,int w){ edge[tot].to=v;edge[tot].w=w;edge[tot].nxt=head[u];head[u]=tot++; edge[tot].flag=0; } queue<int>q; int d[maxn]; void dfs(int u,int c,int deep){ if(d[u]>deep){ d[u]=deep; q.push(u); } for(int i=head[u];i!=-1;i=edge[i].nxt){ if(edge[i].flag)continue; if(edge[i].w==c){ edge[i].flag=1; dfs(edge[i].to,c,deep); } } } void bfs(){ while(q.size())q.pop(); memset(d,0x3f,sizeof d); q.push(1); d[1]=0; while(q.size()){ int u=q.front();q.pop(); for(int i=head[u];i!=-1;i=edge[i].nxt){ if(edge[i].flag)continue; int v=edge[i].to; edge[i].flag=1; dfs(v,edge[i].w,d[u]+1); } } } int main(){ while(cin>>n>>m){ memset(edge,0,sizeof edge); init(); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w);add(v,u,w); } bfs(); if(d[n]==INF)puts("-1"); else cout<<d[n]<<" "; } }