zoukankan      html  css  js  c++  java
  • 洛谷P2384 最短路 题解

    题目简叙:

    请你求出从1到n的最短路径,其中最短路径☞这条路经过的边的权值的乘积。

    题目分析:

    很显然,这也是一道经典的单元最短路问题,首先我们可以考虑使用Floyd,显然,这是一个比较无脑简单的最短路算法,而且包治负边权等等。但是时间复杂度太高,可达O(n3)O(n^3).这道题目看起来可能是刚刚好,但据说会被卡常数呀。

    再就是可以用dijkstra,但此题不保证边权不为负,但dijkstra还是奇迹般的过了,不知道是不是因为乘积的问题?

    最后可以考虑spfa了,这是一个传说中noip最爱卡的最短路算法,但用在这道题还是可以的。

    下面放上dijkstra的代码?

    (标准写法,值得一学

    #include<cstdio>
    #include<vector>
    #include<queue>
    using namespace std;
    struct edge
    {
    	int to,val;
    };
    priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > >q;
    vector<edge>e[1005];
    int dis[1005],vis[1005];
    int main()
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++)
    	{
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		edge tmp;
    		tmp.to=y;
    		tmp.val=z;
    		e[x].push_back(tmp);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		dis[i]=2147483647;
    	}
    	dis[1]=1;
    	q.push(make_pair(1,1));
    	while(!q.empty())
    	{
    		int x=q.top().second;
    		q.pop();
    		if(vis[x]==1)
    		continue;
    		vis[x]=1;
    		for(int i=0;i<e[x].size();i++)
    		{
    			int y=e[x][i].to;
    			if(dis[x]*e[x][i].val<dis[y])
    			{
    				dis[y]=(dis[x]*e[x][i].val)%9987;
    				q.push(make_pair(dis[y],y));
    			}
    		}
    	}
    	printf("%d",dis[n]%9987);
    	return 0;
    }
    

    完结撒花~

  • 相关阅读:
    页面优化
    php安全开发(1)文件包含漏洞
    换工作之后需要兼容ie8的我
    vue
    最近在写h5的页面,发现有一款框架还不错给大家推荐一下
    一个控制器两个轮播
    箭头的制作
    layui
    h5视频播放
    两侧跟随广告
  • 原文地址:https://www.cnblogs.com/vercont/p/10210063.html
Copyright © 2011-2022 走看看