思路:对点离散化用BF求解
code:
#include <bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define of(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
#define P_B push_back
const int inf=0x3f3f3f3f;
const ll INF=9e18;
//const ll mod=;
const int M=1e6+10,N=210;
int len[N],a[N],b[N];
int vals[N],cnt_v;
int f[N],d[N];
//f[i][j]表示以j为结尾恰好走i步的最短路长度(i的一维省略)
struct Node {int v,val;};
vector <Node> no[N];
int main()
{
ios::sync_with_stdio(0);
int n,t,s,e;cin>>n>>t>>s>>e;
vals[++cnt_v]=s; vals[++cnt_v]=e;
fo(i,1,t)
{
cin>>len[i]>>a[i]>>b[i];
vals[++cnt_v]=a[i];
vals[++cnt_v]=b[i];
}
sort(vals+1,vals+cnt_v+1);
int p=unique(vals+1,vals+cnt_v+1)-(vals+1);
s=lower_bound(vals+1,vals+p+1,s)-vals;
e=lower_bound(vals+1,vals+p+1,e)-vals;
fo(i,1,t)
{
a[i]=lower_bound(vals+1,vals+p+1,a[i])-vals;
b[i]=lower_bound(vals+1,vals+p+1,b[i])-vals;
Node rr; rr.v=b[i]; rr.val=len[i];
no[a[i]].P_B(rr);
rr.v=a[i];
no[b[i]].P_B(rr);
}
//离散化
memset(d,0x3f,sizeof(d));
d[s]=0;
fo(i,1,n)
{
memcpy(f,d,sizeof(f));
memset(d,0x3f,sizeof(d));
fo(j,1,p)
for(int k=0;i<no[j].size();++k)
if(f[j]>f[no[j][k].v]+no[j][k].val) f[j]=f[no[j][k].v]+no[j][k].val;
}
cout<<d[e]<<endl;
//BF
return 0;
}
/*
in1:
2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
out1:
10
*/