【无标题】最短路算法

  • Bellman-Ford
#include <bits/stdc++.h>
using namespace std;
const int N=500005;
int dis[N],backup[N];
long long ans=0;
int n,m,k;
struct stu{
	int a,b,v;
}s[N];
int pollman(){
    memset(dis,0x3f3f3f,sizeof dis);
    dis[1]=0;
    for(int i=1;i<=k;i++){
		 memcpy(backup,dis,sizeof dis);
		 for(int j=1;j<=m;j++){
		 	 int a=s[j].a,b=s[j].b,v=s[j].v;
		 	 dis[b]=min(dis[b],v+backup[a]);
	
		 }	
	}
	if(dis[n]>0x3f3f3f/2)
	return -1;
	else
	return dis[n];
	
}
int main() {
   cin>>n>>m>>k;
    for(int i=1;i<=m;i++){
    	int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		s[i]={a,b,c};
	}
	int t=pollman();
	if(t==-1)
	cout<<"impossible";
	else
	cout<<t;
}
  • SPFA
#include <bits/stdc++.h>
using namespace std;
const int N=5000005;
int ne[N],e[N],idx,h[N],u[N];
int n,m,dis[N];
bool f[N];//看某个元素是否存在队列里面 
void add(int a,int b,int c){
	e[idx]=b,u[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int spfa(){
	memset(dis,0x3f3f3f,sizeof dis);
	queue<int> q;
	q.push(1);
	dis[1]=0;
	f[1]=true;
	while(q.size()){
		int t=q.front();
		q.pop();
		f[t]=false;
		for(int i=h[t];i!=-1;i=ne[i]){	
			int j=e[i];
			if(dis[j]>dis[t]+u[i]){
				dis[j]=dis[t]+u[i];
				if(!f[j]){
					f[j]=true;
					q.push(j);
				   
				}
			}		
		} 
	}
	return dis[n];
}
int main(){
	memset(h,-1,sizeof h);
	 cin>>n>>m;
	 for(int i=0;i<m;i++){
	 	int a,b,c;
	 	cin>>a>>b>>c;
	 	add(a,b,c);
	 	add(b,a,c);
	 }
	 int t=spfa();
	 cout<<t;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值