数据结构实验:最短路
描述
给定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); }
原文:https://www.cnblogs.com/llhsbg/p/11209687.html