前言
这是一篇迟到的博客
题目
找一条最廉价的最短路径
输入输出(建议无视)
Input
输入文件第一行有两个整数m和n,用一个空格隔开,其中,m是顶点数,而n是边数。接下来的n行给出所有的边及其价值,每行有3个整数(相邻两个整数间有一个空格),表示起点,终点和边的价值。顶点最多有100个,编号在0到99之间。边最多有1000条,其价值在0到2^15-1之间。
Output
输出文件仅有一行包含一个整数,即V0→V1的廉价最短路径的费用。当出现有多个廉价最短路径的情况时,它们的费用是一样的。
Sample Input
4 5
0 2 2
0 3 2
0 1 10
2 1 2
3 1 2
Sample Output
10
解题思路
正常最短路算法,只不过加上一个判断
代码
#include<cstdio>
using namespace std;
struct woc{long long next,x,y,w;
};
woc a[1001];
long long xx,yy,n,m,k,state[101],ls[101],t,head,tail,f[101],s[101];
bool v[101];
int main()
{scanf("%lld%lld",&n,&m);state[1]=1;int u=0;for (int i=1;i<=m;i++){scanf("%lld%lld%lld",&xx,&yy,&a[u+1].w);xx++;yy++;a[++u].next=ls[xx];a[u].x=xx;a[u].y=yy;ls[xx]=u;}for (int i=1;i<=n;i++) {f[i]=2147483647;s[i]=2147483647;}head=0;tail=1;state[1]=1;v[state[1]]=true;f[1]=0; s[1]=0;while (head!=tail)//SPFA{head++;head=(head-1)%n+1;t=ls[state[head]];while (t!=0){if (f[a[t].x]+1<f[a[t].y] || s[a[t].y]>s[a[t].x]+a[t].w && f[a[t].x]+1==f[a[t].y]){s[a[t].y]=s[a[t].x]+a[t].w;//改变价值f[a[t].y]=f[a[t].x]+1;if (!v[a[t].y]){tail++;tail=(tail-1)%n+1;state[tail]=a[t].y;v[a[t].y]=true;}}t=a[t].next;}v[state[head]]=false;}printf("%lld",s[2]);
}