洛谷 P2384 最短路

这是一篇关于解决洛谷P2384题目的文章,题目要求在给定的带权有向图中找到从节点1到节点n边权之积最小的简单路径。通过输入n个点m条边的信息,使用邻接表结合SPFA算法求解,确保在数据限制范围内,如n<=1000, m<=1000000,且边权不超过10000。文章会提供具体的解题思路和输出格式说明。" 128179412,8732791,知识图谱的系统工程视角,"['知识图谱', '数据工程', '信息管理', '人工智能', '数据科学']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷 P2384 最短路

题目原地址 https://www.luogu.org/problem/P2384

  • 题目描述
    给定n个点的带权有向图,求从1到n的路径中边权之积最小的简单路径。
  • 输入格式
    第一行读入两个整数n,m,表示共n个点m条边。 接下来m行,每行三个正整数x,y,z,表示点x到点y有一条边权为z的边。
  • 输出格式
    输出仅包括一行,记为所求路径的边权之积,由于答案可能很大,因此狗哥仁慈地让你输出它模9987的余数即可。
  • 数据限制
    对于20%的数据,n<=10。
    对于100%的数据,n<=1000,m<=1000000。边权不超过10000。
  • 输入输出样例
    - 输入
3 3
1 2 3 
2 3 3 
1 3 10

-输出

9

整体思路:邻接表+SPFA直接带走

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
int n,m,head[320000],cnt,dis[150000],vis[150000];
struct node{
	int next;
	int from,to,dis;
}s[3200000];
void add_edge(int from,int to,int dis){
	s[++cnt].next=head[from];
	s[cnt].to=to;
	s[cnt].dis=dis;
	head[from]=cnt;
}
int main(){
	cin>>n>>m;
	memset(head,0,sizeof(head));
	memset(dis,inf,sizeof(dis));
	memset(vis,0,sizeof(vis));
	for(int i=0;i<m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add_edge(a,b,c);
		add_edge(b,a,c);
	}
	vis[1]=1,dis[1]=0;
	queue<int>Q;
	Q.push(1);
	while(!Q.empty()){
		int u=Q.front();
		Q.pop();
		vis[u]=0;
		for(int i= head[u];i;i=s[i].next){
			int to=s[i].to;
			int di=s[i].dis;
			if(dis[to]>dis[u] + di){
				dis[to]=dis[u]+di;
				if(!vis[to]){
					vis[to]=1;
					Q.push(to);
				}
			}
		}
	}
	cout<<dis[n]%9987;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值