时间限制(普通/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 }