首页 > 其他分享 >[CF576D] Flights for Regular Customers

[CF576D] Flights for Regular Customers

时间:2023-11-01 09:22:05浏览次数:35  
标签:CF576D int Floyd long Flights Regular include define

CF576D
把矩阵定义为 \(f_{t,i,j}\) 表示恰好 t 步后 i,j 是否可达,则广义乘法为

\[f_{t+1,i,j}=\sum_{k=1}^{n}f_{t,i,k}\wedge f_{1,k,j} \]

因为是或操作,所以 \(f_{i,j}=1\) 时答案或上另一个乘数的第 j 行即可,bitset 优化。
从小到大扩展 d,这时从恰好 d 步数可达的点 bfs 即可。
Floyd 的 k 在最外层 Floyd 的 k 在最外层 Floyd 的 k 在最外层

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<bitset>
using namespace std;
#define db double
#define ll long long
#define ull unsigned long long
#define ld long double
#define b1t bitset
const int MAXN=155;
const ll INF=1e18;
void read(int &x){
	x=0;int f=1;char s=getchar();
	while(s<'0'||s>'9'){
		if(s=='-') f=-1;s=getchar();
	}
	while(s>='0'&&s<='9'){
		x=(x<<3)+(x<<1)+(s^48);s=getchar();
	}
	x*=f;
}
int n,m;
ll dp[MAXN][MAXN],Ans=INF;
struct edg{
	int x,y,d;
	edg(){};
	edg(int X,int Y,int D){
		x=X;y=Y;d=D;
	}
	bool operator<(const edg &a)const{
		return d<a.d;
	}
}ed[MAXN];
struct mat{
	b1t<MAXN> f[MAXN];
	void init(){
		for(int i=1;i<=n;i++) f[i].reset();
	}
}st;
mat operator*(mat a,mat b){
	mat c;
	c.init();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a.f[i][j]) c.f[i]|=b.f[j];
		}
	}
	return c;
}
int main(){
	read(n);read(m);
	for(int i=1;i<=n;i++) st.f[i][i]=1;
	for(int i=1,x,y,z;i<=m;i++){
		read(x);read(y);read(z);
		ed[i]=(edg){x,y,z};
	}
	sort(ed+1,ed+1+m);
	for(int now=1;now<=m;now++){
		mat tmp;tmp.init();
		for(int i=1;i<now;i++){
			tmp.f[ed[i].x][ed[i].y]=1;
		}
		int dis=ed[now].d-ed[now-1].d;
		while(dis){
			if(dis&1) st=st*tmp;
			tmp=tmp*tmp;dis>>=1;
		}	
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i==j) dp[i][j]=0;
				else dp[i][j]=INF;
			}
		}
		for(int i=1;i<=now;i++){
			dp[ed[i].x][ed[i].y]=1;
		}
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
				}
			}
		}
		for(int i=1;i<=n;i++){
			if(st.f[1][i]) Ans=min(Ans,ed[now].d+dp[i][n]);
		}
	}
	if(Ans==INF) printf("Impossible");
	else printf("%d",Ans);
	return 0;
}

标签:CF576D,int,Floyd,long,Flights,Regular,include,define
From: https://www.cnblogs.com/StranGePants/p/17802276.html

相关文章

  • AtCoder Regular Contest 164 F Subtree Reversi
    洛谷传送门AtCoder传送门非常好题目。发现每个点颜色被反转的次数是固定的,为其深度(根结点深度为\(0\))。于是可以看作是,一放棋子就得到分数。那么先手取偶数层和后手取奇数层都会使先手得分,所以双方的目标都是尽可能多取偶数层的结点。考虑若一开始有偶数层的叶子,那么当前的......
  • How to use regular expression to match a special meta tag in html string using j
    HowtouseregularexpressiontomatchaspecialmetataginhtmlstringusingjavascriptAllInOnemetatagerror❌consthtml=`<!DOCTYPEhtml><htmllang="en"><head><metaname="twitter:card"content......
  • AtCoder Regular Contest 167——B - Product of Divisors
    题目很明显,给定 所有因数的积不断除以最多能除几次。首先,很容易发现,对于每一对因子,都可以对答案得出B的贡献,设A的因子数目为n。将A进行质因数分解,PBa1,PBa2,PBa3……PBam,那么因数个数就是质因子加一的乘积。那么因子对数也就是前者一半。答案就是B乘因子对数除以二注意此处......
  • AtCoder Regular Contest 167
    Preface补一下上周日的ARC,因为当天白天和队友一起VP了一场所以就没有精力再打一场了这场经典C计数不会D这种贪心乱搞反而是一眼秒了,后面的EF过的太少就没看A-ToastsforBreakfastParty用一个类似于蛇形的放法就好了,比如对于\(n=9,m=5\),放法为:567894321#includ......
  • AtCoder Regular Contest 066 F Contest with Drinks Hard
    洛谷传送门AtCoder传送门下文令\(a\)为原题中的\(T\)。考虑若没有饮料,可以设\(f_i\)表示,考虑了前\(i\)道题,第\(i\)道题没做的最大得分。转移就枚举上一道没做的题\(j\),那么\([j+1,i-1]\)形成一个连续段。设\(b_i\)为\(a_i\)的前缀和,可得:\[f_i=\max\li......
  • Atcoder Regular Contest 167
    卡B下大分了,怎么回事呢。A.ToastsforBreakfastParty发现题意是让方差尽可能小,就是让\(A\)里的值尽可能接近。所以从小到大排个序,把\(A_{N,\dots,N-M+1}\)依次放进\(1,2,\dots,M\),再把\(A_{N-M,\dots,1}\)依次放进\(M,M-1,\dots,2M-N+1\)就赢了。B.Productof......
  • Python_regular expression基础
     ......
  • Working with Regular Expression in Python.
    #正则表达式正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。一个正则表达式是一种从左到右匹配主体字符串的模式,常使用缩写的术语“regex”或“regexp”。实验网站:regex101参考:菜鸟正则语法元字符正则表达式起作用主要依赖......
  • AtCoder Regular Contest 166
    Preface上周末因为上课而且这天下午还有CF要打,所以就没现场打这场ARC了这两天事情也特别多导致写题的时间很少,摸了好久总算是补了四个题A-ReplaceCorSwapAB感觉是我做法复杂了,怎么A题码量好大首先我们找到所有\(Y\)中为\(C\)的位置,显然对应的\(X\)中的位置也必须为\(C......
  • AtCoder Regular Contest 166——A - Replace C or Swap AB
    题目描述  中文题目描述每个字符串的长度为N,由A,B和C组成。通过对X执行以下三种操作任意次数(可能为零),确定是否有可能使X与y重合。 操作(1):选择X中的字符C替换为字符A。操作(2):在X中选择字符C替换为字符B。操作(3):选择X中的子字符串AB,替换为BA。更正式地说,选择......