社区讨论

50pts求条,悬赏4个关注

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lvdfjyye
此快照首次捕获于
2024/04/24 14:24
2 年前
此快照最后确认于
2024/04/24 19:23
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1E6+5;
#define int long long
struct Edge{
	int x,y;
};
vector<Edge> G[N];
int dis[N],in[N];
bool vis[N];
int n,m,s;
bool spfa(int x){
	queue<int> q;
	memset(dis,0x7f,sizeof(dis));
	q.push(x);
    ++in[x];
	dis[x]=0,vis[x]=1;
	while(!q.empty()){
		int tmp=q.front();
		q.pop();
		vis[tmp]=0;
		for(auto [v,w]:G[tmp]){
			if(dis[v]>dis[tmp]+w){
				dis[v]=dis[tmp]+w;
				if(!vis[v]){
                    ++in[v];
                    if(in[v]>=n+1){
                        return 0;
                    }
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	return 1;
} 
void work(){
	int u,v,w,op;
	cin>>n>>m;
	while(m--){
		cin>>op;
		if(op==1){
			cin>>u>>v;
			G[u].push_back({v,0});
			G[v].push_back({u,0});
		}else if(op==2){
			cin>>u>>v;
			G[v].push_back({u,-1});
		}else if(op==3){
			cin>>u>>v;
			G[u].push_back({v,0});
		}else if(op==4){
			cin>>u>>v;
			G[u].push_back({v,-1});
		}else{
			cin>>u>>v;
			G[v].push_back({u,0});
		}
		
	}for(int i=1;i<=n;++i) G[0].push_back({i,0});
    if(!spfa(0)) cout<<-1<<endl;
	else{
		int minn=0;
		for(int i=1;i<=n;++i){
            minn=min(minn,dis[i]);
		}
		int ans=0;
        for(int i=1;i<=n;++i){
            ans+=dis[i]-minn+1;
		}cout<<ans<<endl;
	}
	return ;
} 
signed main(){
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	work();
    return 0;
}

回复

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

正在加载回复...