首页 > 其他分享 >51nod 2842 城际旅行

51nod 2842 城际旅行

时间:2024-09-04 10:38:37浏览次数:3  
标签:cnt 51nod ++ ll 2842 城际 int edge head

原题链接

image

这题因为要求满足 t 时间内,所以用 dp ,不过我们的状态比较特殊,\(dp[i][j]\) 表示到 \(i\) 点时经过 \(j\) 个点的最短时间,因为题目为 DAG 所以要用拓扑排序,每到一个点,枚举所有出边,更新出点的状态 \(f[v][j+1]=min(f[v][j+1],f[u][j])\),最后的答案就是所有 \(f[t][j]\le t\) 中最大的 \(j\)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 5005

int n,m;
ll t;
int cnt=0;
struct Edge{
	int to,next,w;
}edge[2*N];
int head[N];

void add_edge(int u,int v,int w){
	cnt++;
	edge[cnt].to=v;
	edge[cnt].next=head[u];
	edge[cnt].w=w;
	head[u]=cnt;
} 

int in[N];
queue<int> q;
ll f[N][N];


void topo_sort(){
	
	for(int i=1;i<=n;i++){
		if(!in[i]){
			q.push(i);
		}
	}
	
	while(!q.empty()){
		int x=q.front();
		q.pop();
		
		for(int i=head[x];i!=-1;i=edge[i].next){
			int y=edge[i].to;
			
			for(int j=1;j<=n;j++){
				ll kk=f[x][j]+edge[i].w;
				if(kk<=t){//直接不加超过t的,其实加也行
					f[y][j+1]=min(f[y][j+1],kk);
				}
			}
			
			if(--in[y]==0){
				q.push(y);
			}
		}
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>t;
	
	for(int i=1;i<=n;i++){
		head[i]=-1;
	} 
	
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add_edge(u,v,w);
		in[v]++;
	}
	
	memset(f,0x3f,sizeof f);
	
	f[1][1]=0; 
	
	topo_sort();

	for(int j=n;j>=1;j--){
		if(f[n][j]<=t){
			cout<<j;
			return 0;
		}
	} 
	cout<<0;
	return 0; 
}

标签:cnt,51nod,++,ll,2842,城际,int,edge,head
From: https://www.cnblogs.com/sadlin/p/18395972

相关文章

  • 51nod 1366 贫富差距
    51nod1366贫富差距这题题面挺抽象的,一个人与他所以的朋友的钱不能超过\(d\),问朋友链上钱最多的人的钱与钱最少的人的钱相差多少,求差距的最大值。如果两个人不属于同一个连通块那么差距可以无穷大,好了特殊情况解决了。然后为了使这个差距最大,那么对于每个朋友我们都取\(d\)......
  • 51nod 3179 绝世好题
    3179绝世好题他仅仅要求序列最长的长度,我们可以引用最长上升子序列的思想(有些隐蔽),设状态\(dp[i]\)为二进制第i位为1的最长序列长度,对于一个数10101\(dp[1],dp[3],dp[5]\)都应该加一,对他们的数值取个最大值,并将他们的状态与最大值比较更新。下列代码为上述思路:#includ......
  • 51nod 3010 The Captain
    暴力构图为\(O(n^2)\)无法实现,但可以发现有些边无用,可以先按x排序,第i号点与第i+1号点一定最近,所以建一条边,y坐标同理,然后跑最短路即可自动选择\(min(|x_1-x_2|,|y_1-y_2|)\)#include<bits/stdc++.h>usingnamespacestd;constlonglongINF=0x3f3f3f3f;constint......
  • 51nod 1204 Parity
    闲话虽然这题好像找不到原题了,但毋庸置疑地说这的确是并查集的好题。分析可以先对奇偶区间进行分析,当这个有偶数个1时,区间\(1-(left-1)\)一定与区间\(1-right\)的奇偶性相同。如此图\(3-4\)为偶区间,根据分析,\(1-2\)为奇区间。\(1-4\)也为奇区间。但如果填入的......
  • 51nod两问-Pinball等
    问题1-Pinball为什么这样解释的通,我看不懂什么意思?还有这个\(e\)在后面状态中没有体现。具体做法?为什么只有\([a_i,c_i]\)需要考虑?他可以往左边掉。那么从\(n\)开始掉又如何考虑Kamp手绘的图:这个图似乎就不满足了。不知道什么意思。这个思路怎么做。......
  • 51nod-3928方伯伯的玉米田
    https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338https://class.51nod.com/Html/Textbook/Problem.html#problemId=3928&textbookChapterId=725保证右端点为\(n\)是因为如果不是这样操作,可能导致后面的数大小关系发生变化,而如果保证了......
  • 51nod-3986-免费的馅饼
    https://class.51nod.com/Html/Textbook/Problem.html#problemId=3986&textbookChapterId=725https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338我们将馅饼表示为\((p_i,t_i)\),即一个平面直角坐标系上的点。我们把馅饼看成静止,人每次往......
  • 51nod-3976-最长序列
    https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338https://class.51nod.com/Html/Textbook/Problem.html#problemId=3976&textbookChapterId=725LIS是符号只有大于或小于,所以这道题就是LIS问题。状态设计同LIS,由于答案就是长度,所以就能知......
  • 51nod-基因匹配+luogu-【模板】最长公共子序列
    https://www.luogu.com.cn/problem/P1439https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=338以上两个都是特例,一个是每个元素不重复,一个是每个元素均有5个。正确性说明参考:https://www.luogu.com.cn/article/1bcs9052由于一般情况可能出......
  • 51nod-3978列车
    https://class.51nod.com/Html/Textbook/Problem.html#problemId=3978&textbookChapterId=724https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337这里一次发车的转移是\([j+1,i]\),出发时间\(+s\)为\(j+1\)启程返回,偏移\(i-j-1\)就......