• 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 }
  • 相关阅读:
    如何解决虚拟机频繁分离和附加磁盘导致的识别错误
    创建基于 AFS 的 Docker 容器卷
    使用 docker-machine 管理 Azure 容器虚拟机
    SSH 无法启动的原因分析及解决方法
    Azure 经典模式中虚拟机证书指纹的生成和作用
    远程桌面到 Ubuntu 虚拟机
    Azure Linux 虚拟机常见导致无法远程的操作
    Azure Linux 虚机上配置 RAID 的常见问题及解决方案
    使用 Azure CLI 在 Azure China Cloud 云平台上手动部署一套 Cloud Foundry
    数据库设计(六)第二范式(2NF)?
  • 原文地址:https://www.cnblogs.com/ChangeG1824/p/11469355.html
Copyright © 2020-2023  润新知