zoukankan      html  css  js  c++  java
  • tzoj5855: 数据结构实验:最短路(SPFA)

    时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

    描述

    给定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。

    计算位数的方法:

    假设a=b*c*d,log10(a)=log10(b*c*d)=log10(b)+log10(c)+log10(d)

    对结果向上取整,如果结果为整数则位数+1

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <vector>
     5 #include <queue>
     6 #include <math.h>
     7 using namespace std;
     8 
     9 const int N=1e3+5,INF=0x3f3f3f3f;
    10 int n,m,x,y,w;
    11 struct Node{
    12     int to;
    13     double d;
    14 };
    15 double dst[N];
    16 int vis[N];
    17 vector<Node> g[N];
    18 
    19 int sol(double x){
    20     int i=ceil(x);///向上取整,floor()向下取整
    21     if(fabs(i-x)<1e-6) return i+1;
    22     else return i;
    23 }
    24 
    25 void SPFA(int u){
    26     queue<int> que;
    27     memset(vis,0,sizeof vis);
    28     for(int i=0;i<=n;i++){
    29         dst[i]=INF;
    30     }
    31     dst[u]=0,vis[u]=1;
    32     que.push(u);
    33     while(!que.empty()){
    34         int f=que.front();
    35         que.pop();
    36         vis[f]=0;
    37         int len=g[f].size();
    38         for(int i=0;i<len;i++){
    39             Node v=g[f][i];
    40             if(v.d+dst[f]<dst[v.to]){
    41                 dst[v.to]=v.d+dst[f];
    42                 if(vis[v.to]==0){
    43                     que.push(v.to);
    44                     vis[v.to]=1;
    45                 }
    46             }
    47         }
    48     }
    49 }
    50 
    51 int main(){
    52     Node node;
    53     scanf("%d%d",&n,&m);
    54     for(int i=1;i<=m;i++){
    55         scanf("%d%d%d",&x,&y,&w);
    56         node.to=y,node.d=log10(w);
    57         g[x].push_back(node);
    58     }
    59     SPFA(1);
    60     if(dst[n]>=INF) printf("Sorry
    ");
    61     else printf("%d
    ",sol(dst[n]));
    62 }
  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/ChangeG1824/p/11469355.html
Copyright © 2011-2022 走看看