社区讨论
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 条回复,欢迎继续交流。
正在加载回复...