求助,为什么只有50分
查看原帖
求助,为什么只有50分
400148
清木楼主2022/7/22 12:48
#include<bits/stdc++.h>
using namespace std;
int ans,n,k,num,minn=1e9,x,a,b;
int head[100005],cnt[100005],dis[100005];
bool vis[100005];
queue<int>q;
struct Node{
	int to,next,d;
}edge[3*100005];
void add(int u,int v,int d){
	edge[++num].to=v;
	edge[num].d=d;
	edge[num].next=head[u];
	head[u]=num;
}
bool spfa(){
	memset(dis,0x3f,sizeof(dis));
	dis[0]=0;
	vis[0]=true;
	cnt[0]=-1;
	q.push(0);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=false;
		for(int i=head[x];i;i=edge[i].next){
			int y=edge[i].to;
			int z=edge[i].d;
			if(dis[x]+z<dis[y]){
				dis[y]=dis[x]+z;
				cnt[y]=cnt[x]+1;
				if(cnt[y]==n){
					return false;
				}
				if(!vis[y]){
					vis[y]=true;
					q.push(y);
				}
			}
		}
	}
	return true;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		add(0,i,0);
	}
	for(int i=1;i<=k;i++){
		cin>>x>>a>>b;
		if(x==1){
			add(a,b,0);
			add(b,a,0);
		}
		else if(x==2){
			add(b,a,-1);
		}
		else if(x==3){
			add(a,b,0);
		}
		else if(x==4){
			add(a,b,-1);
		}
		else{
			add(b,a,0);	
		}
	}
	if(spfa()==false){
		cout<<"-1";
	}
	else{
		for(int i=1;i<=n;i++){
			minn=min(minn,dis[i]);
		}
		if(minn<=0){
			minn=abs(minn)+1;
			for(int i=1;i<=n;i++){
				dis[i]+=minn;
			}
		}
		else if(minn>1){
			minn=minn-1;
			for(int i=1;i<=n;i++){
				dis[i]-=minn;
			}
		}
		for(int i=1;i<=n;i++){
			ans+=dis[i];
		}
		cout<<ans;
	}
	return 0;
}

2022/7/22 12:48
加载中...