最小花费--SPFA

版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/89599813

luogu 1576

在这里插入图片描述

题目分析:

反起跑spfa,算出费用

Code:

#include <bits/stdc++.h>
using namespace std;
#define maxn 2010
#define maxm 100010

int A,B,cnt,n,m,vis[maxn],head[maxn];
double d[maxn];
struct node {
	int u,v,nxt;
	double w;
}e[maxm<<1];

inline void init_() {
	freopen("a.txt","r",stdin);
}

inline int read_() {
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

inline void clean_() {
	memset(vis,0,sizeof(vis));
	memset(head,-1,sizeof(head));
	cnt=0;
}

inline void add_(int u,int v,double w) {
	e[++cnt].u=u;
	e[cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}

inline void readda_() {
	clean_();
	n=read_();m=read_();
	int x,y;double z;
	for(int i=1;i<=m;i++) {
		x=read_();y=read_();scanf("%lf",&z);
		add_(x,y,z);add_(y,x,z);
	}
	A=read_();B=read_();
}

inline void SPFA_() {
	for(int i=1;i<=n;i++) d[i]=999999999;
	deque<int >q;
	int S=B,T=A;
	q.push_back(S);
	vis[S]=1;
	d[S]=100;
	while(!q.empty()) {
		int u=q.front();
		q.pop_front();
		vis[u]=0;
		for(int i=head[u];~i;i=e[i].nxt) {
			int v=e[i].v,w=e[i].w;
			double pp=w;
			pp/=100.0;
			pp=1.0-pp;
			if(d[v]>d[u]/pp) {
				d[v]=d[u]/pp;
				if(!vis[v]) {
					if(!q.empty()&&d[v]<d[q.front()]) {
						q.push_front(v);
						vis[v]=1;
					}
					else {
						q.push_back(v);
						vis[v]=1;
					}
				}
			}
		}
	}
}

inline void work_() {
	SPFA_();
	printf("%.8lf",d[A]);
}

int main() {
	init_();
	readda_();
	work_();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44574520/article/details/89599813