求找错
查看原帖
求找错
164840
zhaowangji楼主2021/11/17 15:10
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3007;
const int INF=1e9;
int Read();
void add_edge(int u,int v,int w);
struct Edge{
	int u,v,w,nxt;
}e[2*MAXN];int h[MAXN],e_cnt;
int n,m;
void minn_path();
void dijsktra(int k);
void add_virtual_spot_and_get_new_edge_weight();
void SPFA(int k);
void minus_circle();
int vis[MAXN],cnt[MAXN],dis[MAXN],re[MAXN];
int main(){
	n=Read(),m=Read();
	for(int i=1;i<=m;++i){
		int u=Read(),v=Read(),w=Read();
		add_edge(u,v,w);
	}
	add_virtual_spot_and_get_new_edge_weight();
	minn_path();
	return 0;
}
void minn_path(){
	for(int i=1;i<=n;++i){
		dijsktra(i);
		long long ans=0;
		for(int j=1;j<=n;++j)
			if(dis[j]==1e9)ans+=j*dis[j];
			else ans+=j*(dis[j]+re[j]-re[i]);
		printf("%lld\n",ans);
	}
}
void dijsktra(int k){
	for(int i=1;i<=n;++i)dis[i]=INF;
	memset(vis,0,sizeof(vis));
	dis[k]=0;
	priority_queue<pair<int,int> > q;
	q.push(make_pair(0,k));
	while(!q.empty()){
		int x=q.top().second;q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=h[x];i;i=e[i].nxt){
			int v=e[i].v,w=e[i].w;
			if(dis[x]+w<dis[v]){
				dis[v]=dis[x]+w;
				q.push(make_pair(-dis[v],v));
			}
		}
	}
}
void add_virtual_spot_and_get_new_edge_weight(){
	for(int i=1;i<=n;++i){
		add_edge(0,i,0);
	}
	SPFA(0);
	for(int u=1;u<=n;++u)
		for(int i=h[u];i;i=e[i].nxt)
			e[i].w+=re[u]-re[e[i].v];
}
void SPFA(int k){
	memset(re,0x3f,sizeof(re));
	queue<int> q;
	vis[k]=1,re[k]=0,cnt[k]=1;
	q.push(k);
	while(!q.empty()){
		int x=q.front();q.pop();
		vis[x]=0;
		for(int i=h[x];i;i=e[i].nxt){
			int v=e[i].v,w=e[i].w;
			if(re[x]+w<re[v]){
				re[v]=re[x]+w;
				if(!vis[v]){
					++cnt[v],vis[v]=1;q.push(v);
					if(cnt[v]==n+1){printf("-1\n");exit(0);}
				}
			}
		}
	}
}
void add_edge(int u,int v,int w){
	e[++e_cnt].u=u,e[e_cnt].v=v,e[e_cnt].w=w,e[e_cnt].nxt=h[u],h[u]=e_cnt;
}
int Read(){
	char ch=getchar();
	int f_r=1,res=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f_r=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=res+res*4;
		res+=res+ch-'0';
		ch=getchar();
	}
	return f_r*res;
}
2021/11/17 15:10
加载中...