ABC F 求调
  • 板块学术版
  • 楼主jr_zch
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/10/12 22:03
  • 上次更新2024/10/13 09:06:21
查看原帖
ABC F 求调
772999
jr_zch楼主2024/10/12 22:03

G 都过了,F题不就是考虑删边转加边,每加一条边考虑对任意点对的影响吗??然后 Floyd,过了样例但是wa了,求调


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

const int maxn=3e2+7,maxq=2e5+7,inf=1e16;
int n,m,t;
int mp[maxn][maxn],ans[maxq],l[maxq],r[maxq],w[maxq];
bool is[maxq];
struct node{
	int opt,x,y;
}q[maxq];

signed main(){
	memset(is,1,sizeof(is));
	scanf("%lld%lld%lld",&n,&m,&t);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) if(i!=j) mp[i][j]=inf;
	}
	for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&l[i],&r[i],&w[i]);
	for(int i=1;i<=t;i++){
		scanf("%lld%lld",&q[i].opt,&q[i].x);
		if(q[i].opt==1) is[q[i].x]=0;
		else scanf("%lld",&q[i].y);
	}
	for(int i=1;i<=m;i++) if(is[i]) mp[l[i]][r[i]]=mp[r[i]][l[i]]=min(mp[l[i]][r[i]],w[i]);
	for(int i=t;i;i--){
		if(q[i].opt==1){
			int j=q[i].x;
			mp[l[j]][r[j]]=mp[r[j]][l[j]]=min(mp[l[j]][r[j]],w[j]);
			for(int g=1;g<=n;g++){
				mp[g][l[j]]=mp[l[j]][g]=min(mp[g][l[j]],mp[g][r[j]]+mp[l[j]][r[j]]);
				mp[g][r[j]]=mp[r[j]][g]=min(mp[g][r[j]],mp[g][l[j]]+mp[l[j]][r[j]]);
			}
			for(int g=1;g<=n;g++){
				for(int h=1;h<=n;h++){
					mp[g][h]=min(mp[g][h],mp[l[j]][r[j]]+min(mp[g][l[j]]+mp[r[j]][h],mp[g][r[j]]+mp[l[j]][h]));
				}
			}
		}else ans[i]=mp[q[i].x][q[i].y];
	}
	for(int i=1;i<=t;i++){
		if(q[i].opt==2){
			if(ans[i]!=inf) printf("%lld\n",ans[i]);
			else puts("-1");
		}
	}
	return 0;
}
2024/10/12 22:03
加载中...