O(n^3)求卡常
  • 板块P1186 玛丽卡
  • 楼主xyz123
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/2 23:48
  • 上次更新2024/7/3 10:31:55
查看原帖
O(n^3)求卡常
379926
xyz123楼主2024/7/2 23:48
#include<bits/stdc++.h>
#pragma optimize O2
using namespace std;
const int N=1010,M=1000010;
unsigned dist[N];
unsigned pred[N],prel[N];
int path[N],cnt;
bool st[N];
unsigned int h[N],e[M],ne[M],w[M],rnk[M],idx;
int n,m;
void add(int a,int b,int c,int i){
	e[++idx]=b;
	w[idx]=c;
	rnk[idx]=i;
	ne[idx]=h[a];
	h[a]=idx;
}
int ans;
void dij1(){
	for(short i=1;i<=n;i++){
		dist[i]=0x3f3f3f3f;
		st[i]=0;
	}
	dist[1]=0;
	for(short i=1;i<=n;i++){
		short t=-1;
		for(short j=1;j<=n;j++){
			if((!st[j])&&(t==-1||dist[j]<dist[t]))	t=j;
		}
		st[t]=true;
		short j;
		for(int i=h[t];i;i=ne[i]){
			j=e[i];
			if(dist[t]+w[i]<dist[j]){
				dist[j]=dist[t]+w[i];
				pred[j]=t;
				prel[j]=rnk[i];
			}
		}
	}
	ans=dist[n];
}
void dfs(short u){
	path[cnt++]=prel[u];
	if(pred[u]!=0){
		dfs(pred[u]);
	}
}
void dij2(int bad){
	for(short i=1;i<=n;i++){
		dist[i]=0x3f3f3f3f;
		st[i]=0;
	}
	dist[1]=0;
	short t;
	for(short i=1;i<=n;i++){
		t=-1;
		for(short j=1;j<=n;j++){
			if(!st[j]&&(t==-1||dist[j]<dist[t]))	t=j;
		}
		st[t]=true;
		short j;
		for(int i=h[t];i;i=ne[i]){
			if(rnk[i]==bad)	continue;
			j=e[i];
			if(dist[t]+w[i]<dist[j]){
				dist[j]=dist[t]+w[i];
			}
		}
	}
	if(dist[n]>ans)	ans=dist[n];
}
int read(){
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x;
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int a,b,v;
		a=read();b=read();v=read();
		if(a==b)	continue;
		add(a,b,v,i);
		add(b,a,v,i);
	}
	dij1();
	dfs(n);
	int t=0.9*CLOCKS_PER_SEC;
	for(short i=0;i<cnt;i++){
		dij2(path[i]);
	}
	printf("%lld\n",ans);
}

cnt(经过的边数)最大为n-1

理论上O(N^3)卡常能过,但我的不行

2024/7/2 23:48
加载中...