注意最短路转移的单位元是对角线为0,其它为INF。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #define mkp make_pair using namespace std; const double EPS=1e-12; typedef long long lon; const lon SZ=210,SSZ=5*SZ,one=1,INF=0x7FFFFFFF,mod=1000000007; int n,m,S,T,mnum; int mp[SZ][SZ]; struct nd{ int len,bg,fn; nd(int a=0,int b=0,int c=0):len(a),bg(b),fn(c){} }; nd arr[SZ]; vector<int> ls; int getid(int x) { return lower_bound(ls.begin(),ls.end(),x)-ls.begin()+1; } void init() { cin>>n>>m>>S>>T; for(int i=1;i<=m;++i) { cin>>arr[i].len>>arr[i].bg>>arr[i].fn; ls.push_back(arr[i].bg); ls.push_back(arr[i].fn); } sort(ls.begin(),ls.end()); ls.erase(unique(ls.begin(),ls.end()),ls.end()); mnum=ls.size(); for(int i=1;i<=mnum;++i) { for(int j=1;j<=mnum;++j) { // if(i==j)mp[i][j]=0; // else mp[i][j]=(1<<29); } } for(int i=1;i<=m;++i) { int bg=getid(arr[i].bg); int fn=getid(arr[i].fn); mp[bg][fn]=mp[fn][bg]=arr[i].len; } } void mul(int dst[][SZ],int x[][SZ],int y[][SZ]) { int res[SZ][SZ]; memset(res,0x3f,sizeof(res)); // for(int i=1;i<=mnum;++i) // { // for(int j=1;j<=mnum;++j) // { // res[i][j]=(1<<29); // } // } for(int i=1;i<=mnum;++i) { for(int j=1;j<=mnum;++j) { for(int k=1;k<=mnum;++k) { res[i][j]=min(res[i][j],x[i][k]+y[k][j]); } } } for(int i=1;i<=mnum;++i) { for(int j=1;j<=mnum;++j) { dst[i][j]=res[i][j]; } } } void work() { int res[SZ][SZ],ele[SZ][SZ]; memset(res,0x3f,sizeof(res)); for(int i=1;i<=mnum;++i)res[i][i]=0; memcpy(ele,mp,sizeof(mp)); for(;n;n/=2) { if(n&1)mul(res,res,ele); mul(ele,ele,ele); } S=getid(S),T=getid(T); cout<<res[S][T]<<endl; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int casenum; //cin>>casenum; //cout<<casenum<<endl; //for(int time=1;time<=casenum;++time) //for(int time=1;cin>>n>>m;++time) { //printf("Case #%d:\n",time); init(); work(); } return 0; }