re on #4求条
查看原帖
re on #4求条
1164775
Jadonyzx楼主2024/7/8 20:42
#include<bits/stdc++.h>
#define maxn 100010
#define ll long long
using namespace std;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,q,cnt;
bool vis[maxn];
ll dis[maxn];
int head[maxn];
ll mmax;
queue<int>qq[maxn];
ll f[maxn];
struct EdgE{
	int to,nxt;
	ll val;
}edge[maxn];
void addedge(int from,int to,ll val){
	cnt++;
	edge[cnt].nxt=head[from];
	edge[cnt].to=to;
	edge[cnt].val=val;head[from]=cnt;return;
}
void dj(){
	memset(vis,0,sizeof(vis));
	memset(f,0x3f,sizeof f);
	priority_queue< pair < ll , ll > >q;
	f[1]=0;
	q.push((make_pair(0ll,1ll)));
	while(!q.empty()){
		int now=q.top().second;q.pop();
		if(vis[now])continue;
		vis[now]=1;
		for(int i=head[now];i;i=edge[i].nxt){
			int to=edge[i].to;
			int val=edge[i].val;
			if(dis[now]+val<dis[to]){
				dis[to]=dis[now]+val;
				q.push((make_pair(dis[to],to)));
			}
		}
	}
	return;
}
void solve(int suibian1234){
	memset(f,0x3f,sizeof(f));
	mmax=0ll;f[1]=0;qq[0].push(1);
	for(int i=0;i<=mmax;++i){
		while(!qq[i].empty()){
			int now=qq[i].front();qq[i].pop();
			if(f[now]<i)continue;
			for(int j=head[now];j;j=edge[j].nxt){
				int to=edge[j].to;
				ll val=edge[j].val;
				ll delta=dis[now]+val-dis[to];
				if(f[to]>f[now]+delta){
					f[to]=f[now]+delta;
					if(f[to]<=suibian1234){
						qq[f[to]].push(to);
						mmax=max(mmax,f[to]);
					}
				}
			}
		}
	}
	return;
}
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=m;i++){
		int a,b,c;cin>>a>>b>>c;
		addedge(a,b,c);
	}
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0ll;dj();
	for(int i=1;i<=q;i++){
		int op;cin>>op;
		if(op==1){
			int v;cin>>v;
			if(dis[v]!=inf)cout<<(dis[v])<<'\n';
			else {puts("-1");}
		}
		else{
			int c;cin>>c;
			for(int j=1;j<=c;++j){
				int l;cin>>l;
				edge[l].val++;
			}
			memset(f,0x3f,sizeof f);
			solve(min(c,n-1));
			for(int j=1;j<=n;j++)dis[j]=min(inf,dis[j]+f[j]);
		}
	}
	return 0;
}
2024/7/8 20:42
加载中...