8pts DP RE+TLE+WA+AC玄关求条
查看原帖
8pts DP RE+TLE+WA+AC玄关求条
1237628
Heavenly_meteorite楼主2025/7/6 16:02

代码:

#include <bits/stdc++.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <cstring>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <complex.h>
#include <fenv.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stdint.h>
#include <tgmath.h>
using namespace std;
int n;
int t;
const int N=1e6+10;
const int T=100+10;
int dp[5][T];
int m;
struct Edge{
	int x,y,len,next;
}e[T*2];
int elast[T];
bool Map[1010];
void add(int a,int b,int d){
	e[++m]={a,b,d,elast[a]};
	elast[a]=d;
}
int L[T],R[T],Len[T];
int turn[1010];
int maxx;
int minn=1000;
int d;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int S,E;
	cin>>n>>t>>S>>E;
	for(int i=1;i<=t;i++){
		cin>>Len[i]>>L[i]>>R[i];
		Map[L[i]]=true;
		Map[R[i]]=true;
		maxx=max(maxx,max(L[i],R[i]));
		minn=min(minn,min(L[i],R[i]));
	}
	for(int i=minn;i<=maxx;i++) if(Map[i]) turn[i]=++d;
	for(int i=1;i<=t;i++){
		add(turn[L[i]],turn[R[i]],Len[i]);
		add(turn[R[i]],turn[L[i]],Len[i]);
	}
	S=turn[S];
	E=turn[E];
	memset(dp,0x3f,sizeof(dp));
	dp[0][S]=0;
	int now=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=d;j++){
			int num=elast[j];
			while(num){
				dp[now][j]=min(dp[now^1][e[num].y]+e[num].len,dp[now][j]);
				num=e[num].next;
			}
		}
		for(int j=1;j<=d;j++){
			dp[now^1][j]=0x3f3f3f3f;
		}
		now=now^1;
	}
	cout<<dp[now^1][E];
	return 0;
}
2025/7/6 16:02
加载中...