求经过n个点的最短路值。把矩阵相乘换成floyd,并做一些小改动,再用算快速幂的方法倍增计算即可。
code:
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define INF 1000000000
#define CIR(n, m) for (int i=0; i<n; i++) for (int j=0; j<m; j++)
struct Mat{
Mat(){CIR(301,301) t[i][j]=INF;}
int t[301][301];
int* operator [](int x){return t[x];}
};
int N, T, S, E;
int f[10001] = {0}, top=0;
Mat map;
void floyd(Mat &a, Mat &b, Mat &c){
Mat temp;
for (int k=1; k<=top; k++)
for (int i=1; i<=top; i++)
for (int j=1; j<=top; j++)
temp[i][j] = min(temp[i][j], a[i][k]+b[k][j]);
CIR(301,301) c[i][j] = temp[i][j];
}
int find(int num){
Mat ans;
for (int i=0; i<301; i++) ans[i][i]=0;
while (num){
if (num & 1) floyd(map, ans, ans);
floyd(map, map, map);
num >>= 1;
}
return ans[f[S]][f[E]];
}
int main()
{
cin>>N>>T>>S>>E;
for (int i=0; i<T; i++){
int length, I1, I2;
scanf("%d%d%d", &length, &I1, &I2);
if (!f[I1]) f[I1]=++top;
if (!f[I2]) f[I2]=++top;
map[f[I1]][f[I2]] = map[f[I2]][f[I1]] = length;
}
cout<<find(N)<<endl;
//system("pause");
return 0;
}