复杂度没啥问题但是TLEon8求救/kk
查看原帖
复杂度没啥问题但是TLEon8求救/kk
253765
houpingze楼主2024/9/9 23:50

如题,已经调两天了,不知道为啥/kk

/*

writer:  houpingze
Problem: 不知名屑题
Knowledge: 垃圾算法
Time: O(过不了)
PS:\CCF/ \CCF/ \CCF/ \CCF/ \CCF/

*/
/*
Note:

*/
#include<bits/stdc++.h>
#define MN 114514
#define reg register int
#define INF (1<<30)
#define pb push_back
#define vc vector
#define fst first
#pragma GCC optimize(3)
#define scd second
#define int long long
#define min(x,y) x>y?y:x
#define max(x,y) x>y?x:y
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int read(){
	int res=0,fs=1; char c=getchar();
	while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
	while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
	return res*fs;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
int n,cnt,m,a[500010],ans,tmp,k;
typedef pair<int,int> P;
//struct PROBLEM_SOLVER{
//	   int n,m;
//}solver;

//signed main(){
void py(){
	 cout<<"YES\n";
}

void pn(){
	 cout<<"NO\n";
}
map<int,int>t;
struct edge{
	int to,nxt,w;
}e[100005];
int hd[100050];
void add(int u,int v,int w){
	cnt++;
	e[cnt].to=v;
	e[cnt].w=w;
	e[cnt].nxt=hd[u];
	hd[u]=cnt; 
}
int dis[114154];
bool vis[114514];
queue<int>q[114514];
void dij(){
	priority_queue<P>q;
	memset(dis,0x3f,sizeof(dis));
	
	dis[1]=0;
	q.push(P(0,1));
	while(!q.empty()){
		int u=q.top().second,nw=q.top().fst;
		q.pop();
		if(dis[u]<-nw) continue;
 		for(register int i=hd[u];i;i=e[i].nxt){
			int v=e[i].to; 
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				q.push(make_pair(-dis[v],v));
			}
		}
	}
}
int f[115141];
void bfs(int c){
	int mx=0;
	rep(i,0,mx){
		while(!q[i].empty()){
			int u=q[i].front();
			q[i].pop();
			if(f[u]<i) continue;
			for(register int j=hd[u];j;j=e[j].nxt){
				int v=e[j].to;
				int w=dis[u]+e[j].w-dis[v];
				if(f[v]>f[u]+w){
					f[v]=f[u]+w;
					if(f[v]<=min(c,n-1)){
						q[f[v]].push(v);
						mx=max(mx,f[v]);
					}
				}
			}
		}
	}
}
signed main() {
	//ios::sync_with_stdio(false);
	cin>>n>>m>>tmp;
	rep(i,1,m){
		int u=read(),v=read(),w=read();
//		add(read(),read(),read());
		add(u,v,w);
	}	
	dij();
//	cout<<"DIS:"<<dis[1]<<' '<<dis[2]<<' '<<dis[3]<<endl;
	while(tmp--){
		int op=read(),c=read();
		if(op==1){
			if(dis[c]<=(1ll<<55)) cout<<dis[c]<<'\n';
			else cout<<-1<<'\n';
		}else {
			rep(i,1,c) {
				int u=read();
				e[u].w++;
			}
			memset(f,0x3f,sizeof(f));
			f[1]=0;
			q[0].push(1);
			bfs(c);
			int xxx=(1ll<<60);
			rep(i,1,n){
				dis[i]=min(xxx,f[i]+dis[i]);
			}
		}
	}
    return 0;
}

2024/9/9 23:50
加载中...