最短路
本
题
虽
然
说
是
最
短
路
,
但
直
接
套
模
板
肯
定
不
行
,
于
是
就
考
虑
用
其
它
方
法
,
因
为
每
条
边
的
长
度
为
1
或
2
,
所
以
我
们
可
以
对
于
长
为
2
的
边
新
建
一
个
节
点
,
这
样
就
可
以
广
搜
了
,
时
间
复
杂
度
玄
学
,
加
上
r
e
g
i
s
t
e
r
和
r
e
a
d
才
能
过
本题虽然说是最短路,但直接套模板肯定不行,于是就考虑用其它方法,因为每条边的长度为1或2,所以我们可以对于长为2的边新建一个节点,这样就可以广搜了,时间复杂度玄学,加上register和read才能过
本题虽然说是最短路,但直接套模板肯定不行,于是就考虑用其它方法,因为每条边的长度为1或2,所以我们可以对于长为2的边新建一个节点,这样就可以广搜了,时间复杂度玄学,加上register和read才能过
#include<bits/stdc++.h>
#define rei register int
using namespace std;
inline int read(){
char c=getchar();int ans=0,f=1;
while(c>'9'||c<'0'){c=getchar();if(c=='-') f*=-1;}
for(;'0'<=c&&c<='9';c=getchar() ) ans=(ans<<3)+(ans<<1)+c-'0';
return ans*f;
}
const int N=5e6+5;
int n,m,tot=0,t;
struct edge{
int link,v;
}q[N<<2];
int dis[N*4],head[N*4],ext[N*8],cnt=0;
inline void put(int x,int y){q[++cnt].v=y,q[cnt].link=head[x],head[x]=cnt;}
bool vis[N*4];
void bfs(int s){
int h=1,r=1;
memset(dis,0x7f,sizeof(dis));dis[s]=0;vis[s]=1;
ext[h]=1;
while(r<=h){
int ss=ext[r];
for(rei i=head[ss];i;i=q[i].link){
int v=q[i].v;
if(vis[v]) continue;vis[v]=1;
ext[++h]=v;dis[v]=dis[ss]+1;
if(v==t){
return;
}
}
r++;
}
}
int main(){
scanf("%d%d%d",&n,&m,&t);tot=n;
for(rei i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w==1){
put(u,v),put(v,u);
}
if(w==2){
++tot;
put(u,tot),put(tot,v);
put(tot,u),put(v,tot);
}
}
bfs(1);
printf("%d",dis[t]);
}