首页 > 其他 > 详细

5855: 数据结构实验:最短路

时间:2019-07-18 22:07:03      阅读:65      评论:0      收藏:0      [点我收藏+]

数据结构实验:最短路

描述

 给定n个点的带权有向图,若从顶点x到顶点y之间存在一条路径,那么这条路径的长度定义为路径上各条边的权值之积。

现在请你求出从顶点1到顶点n的最短路径。

 输入

 第一行为两个正整数n和m(n<=1000,m<=5000),n表示顶点数,m表示边数。

接下来有m行,每行三个正整数x,y,w,表示顶点x到y有一条边权为w的边。

1<=x, y<=n,w不大于10000。

两个顶点之间可能存在多条边。

输出

输出题目定义的最短路径值,由于数可能很大,因此你只需要输出总共有几位数即可。

如果不存在路径,则输出Sorry。

样例输入

3 3

1 2 3
2 3 3
1 3 11

样例输出

 1

提示

最短路径为9,1位,因此输出1。

题解:

求1-n权值w乘积最短路位数,转换为权值log10(w)的最短路

代码

技术分享图片
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int inf=0x3f3f3f3f;
struct edge
{
    int to,cost;
}a;
vector<edge>G[1005];
double f[1005];
struct p
{
    double first;
    int second;
    bool operator <(const p &w)const
    {
        return first>w.first;
    }
}e,d;
int bfs()
{
    for(int i=1;i<1005;i++)
        f[i]=1000000;
    priority_queue< p > q;
    e.first=0;
    e.second=1;
    q.push(e);
    f[1]=0;
    while(!q.empty())
    {
        e=q.top();
        q.pop();
        int v=e.second;
        if(f[v]<e.first)
         continue;
        for(int i=0;i<G[v].size();i++)
        {
                a=G[v][i];
            if(f[a.to]>f[v]+log10(a.cost))
            {
                f[a.to]=f[v]+log10(a.cost);
                d.first=f[a.to];
                d.second=a.to;
                q.push(d);
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        a.to=y;a.cost=c;
        G[x].push_back(a);
    }
    bfs();
    if(f[n]==1000000)
    printf("Sorry\n");
    else
    printf("%d\n",(int)floor(f[n])+1);
}
View Code

 

5855: 数据结构实验:最短路

原文:https://www.cnblogs.com/llhsbg/p/11209687.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!