SPFA+Dijkstra求助
查看原帖
SPFA+Dijkstra求助
285373
BlachSnake楼主2021/3/8 19:52
#include<bits/stdc++.h>
using namespace std;
const int N=6666,M=N<<1,inf=1000000000;
struct lsqxx{
	int nxt,to;
	long long w;
}e[M];
int n,m,t,h[N],c[N];
long long s,a[N],d[N];
bool b[N];
void Add_Edge(int x,int y,int z){
	e[++t]=(lsqxx){h[x],y,z};
	h[x]=t;
}
void SPFA(int s){
	int x,y;
	long long z;
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++)a[i]=inf;
	a[s]=0;
	b[s]=1;
	queue<int>q;
	q.push(s);
	while(!q.empty()){
		x=q.front();
		q.pop();
		b[x]=0;
		for(int i=h[x];~i;i=e[i].nxt){
			y=e[i].to;
			z=e[i].w;
			if(a[y]>a[x]+z){
				a[y]=a[x]+z;
				if(!b[y]){
					b[y]=1;
					q.push(y);
					c[y]++;
					if(c[y]==n){
						cout<<-1<<endl;
						exit(0);
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=h[i];~j;j=e[j].nxt)
			e[j].w=e[j].w+a[i]-a[e[j].to];
}
long long Dijkstra(int s){
	int x,y;
	long long z;
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++)d[i]=inf;
	d[s]=0;
	priority_queue<pair<int,int> >q;
	q.push(make_pair(0,s));
	while(!q.empty()){
		x=q.top().second;
		q.pop();
		if(b[x])continue;
		b[x]=1;
		for(int i=h[x];~i;i=e[i].nxt){
			y=e[i].to;
			z=e[i].w;
			if(d[y]>d[x]+z){
				d[y]=d[x]+z;
				q.push(make_pair(-d[y],y));
			}
		}
	}
	z=0;
	for(int i=1;i<=n;i++)z+=d[i]==inf?d[i]*i:(d[i]+a[i]-a[s])*i;
	return z;
}
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	memset(h,255,sizeof(h));
	int x,y;
	long long z;
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>x>>y>>z,Add_Edge(x,y,z);
	for(int i=1;i<=n;i++)Add_Edge(0,i,0);
	SPFA(0);
	for(int i=1;i<=n;i++)cout<<Dijkstra(i)<<endl;
	return 0;
}

RT,最后一个点死活过不去……

各位大佬求调QwQ

2021/3/8 19:52
加载中...