社区讨论

求助,玄关

P5905【模板】全源最短路(Johnson)参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhk7eiab
此快照首次捕获于
2025/11/04 14:44
4 个月前
此快照最后确认于
2025/11/04 14:44
4 个月前
查看原帖
样例都没过。。
CPP
//#include<all_include.h>
#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<limits.h>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<array>
#include<list>
#include<map>
#include<set>
#define umap unordered_map
#define int long long
#define MAXN 1145141
#define MAXX (1<<30)
#define endl '\n'
using namespace std;
struct Edge{
	int next,to,val;
}edge[MAXN];
int n,m,u,v,t,ans;
int shortest[MAXN];
int cnt[MAXN];
template<typename T>
inline void read(T &x){
	int sign=1;x=0;char c=getchar();
	while(!isdigit(c)){if(c=='-')sign=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=sign;
}//getchar_unlocked()
template<typename T1,typename ...T2>
inline void read(T1 &tmp,T2 &...tmps){read(tmp);read(tmps...);}
int head[MAXN],sum;
void add(int from,int to,int val){
	edge[++sum].next=head[from];
	edge[sum].val=val;
	edge[sum].to=to;
	head[from]=sum;
}
bool vis[MAXN];
bool dis[MAXN];
void memset_(){
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++) dis[i]=1e9;
}
bool spfa(){
	queue<int> que;
	for(int i=1;i<=n;i++) que.push(i),vis[i]=true;
	while(!que.empty()){
		int x=que.front();
		que.pop();
		vis[x]=false;
		for(int i=head[x];i;i=edge[i].next){
			int to=edge[i].to;
			int val=edge[i].val;
			if(shortest[to]>shortest[x]+val){
				shortest[to]=shortest[x]+val;
				cnt[to]++;
				if(cnt[to]>=n+1){
					return true;
				}
				if(!vis[to]){
					vis[to]=true;
					que.push(to);
				}
			}
		}
	}
	return false;
}
void dijkstra(int s){
	memset_();
	priority_queue<pair<int,int> > que;
	que.push(make_pair(0,s));
	vis[s]=true;dis[s]=0;
	while(!que.empty()){
		int x=que.top().second;
		que.pop();
		for(int i=head[x];i;i=edge[i].next){
			int to=edge[i].to;
			int val=edge[i].val;
			if(dis[to]>dis[x]+val){
				dis[to]=dis[x]+val;
				if(!vis[to]){
					vis[to]=true;
					que.push(make_pair(-dis[to],to));
				}
			}
		}
	}
}
signed main(){
	read(n,m);
	for(int i=1;i<=m;i++){
		read(u,v,t);
		add(u,v,t);
	}
	for(int i=1;i<=n;i++){
		add(0,i,0);
	}
	if(spfa()){
		cout<<-1<<endl;
		return 0;
	}
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=edge[j].next){
			int to=edge[j].to;
			edge[j].val+=shortest[i]-shortest[to];
		}
	}
	for(int i=1;i<=n;i++){
		dijkstra(i);
		ans=0;
		for(int j=1;j<=n;j++){
			if(dis[j]==1e9){
				ans+=j*1e9;
			}else{
				ans+=j*(dis[j]+shortest[j]-shortest[i]);
			}
		}
		cout<<ans<<endl;
	}
  	return 0;
}

回复

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

正在加载回复...