社区讨论

spfa:它爆时间了,求调

P3275[SCOI2011] 糖果参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mhj39eh9
此快照首次捕获于
2025/11/03 20:00
4 个月前
此快照最后确认于
2025/11/03 20:00
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
typedef long long ll;
typedef long double ldb;
typedef double db;
typedef char ch;
typedef unsigned long long ull;
using namespace std;
const int N=1e5+10,M=6e6+10,K=1e3+10;
const long long mod=1e9+9;
int n,m;
int pre[N],k;
struct node{
	int v,l,next;
}e[N<<1];
void add(int u,int v,int len){
	e[++k]={v,len,pre[u]};
	pre[u]=k;
}
int dis[N],cnt[N];
queue<int>q;
bool vis[N];
ll spfa(){
	q.push(0);
	vis[0]=1;
	memset(dis,-0x3f,sizeof(dis));
	dis[0]=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=pre[x];i;i=e[i].next){
			int v=e[i].v,l=e[i].l;
			if(dis[x]+l>dis[v]){
				dis[v]=dis[x]+l;
				cnt[v]=cnt[x]+1;
				if(cnt[v]>n){
					return -1;
				}
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	ll ans=0;
	for(int i=1;i<=n;i++){
		ans+=dis[i];
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int op,u,v;
		scanf("%d%d%d",&op,&u,&v);
		if(op==1){
			add(u,v,0);
			add(v,u,0);
		}
		else if(op==2){
			add(u,v,1);
		}
		else if(op==3){
			add(v,u,0);
		}
		else if(op==4){
			add(v,u,1);
		}
		else{
			add(u,v,0);
		}
	}
	for(int i=1;i<=n;i++){
		add(0,i,1);
	}
	printf("%lld",spfa());
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...