re求调
查看原帖
re求调
379113
dtrthg楼主2024/5/14 14:45

思路:对点离散化用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
*/
2024/5/14 14:45
加载中...