最短路

12 篇文章 0 订阅

最短路
本 题 虽 然 说 是 最 短 路 , 但 直 接 套 模 板 肯 定 不 行 , 于 是 就 考 虑 用 其 它 方 法 , 因 为 每 条 边 的 长 度 为 1 或 2 , 所 以 我 们 可 以 对 于 长 为 2 的 边 新 建 一 个 节 点 , 这 样 就 可 以 广 搜 了 , 时 间 复 杂 度 玄 学 , 加 上 r e g i s t e r 和 r e a d 才 能 过 本题虽然说是最短路,但直接套模板肯定不行,于是就考虑用其它方法,因为每条边的长度为1或2,所以我们可以对于长为2的边新建一个节点,这样就可以广搜了,时间复杂度玄学,加上register和read才能过 ,122广registerread

#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]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值