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\n");
61     else printf("%d\n",sol(dst[n]));
62 }

 

 

posted @ 2019-09-05 20:05  Cherlie  阅读(255)  评论(0编辑  收藏  举报