救命样例过了0pts
  • 板块P1576 最小花费
  • 楼主XXCCVV
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/31 13:18
  • 上次更新2023/10/23 19:58:16
查看原帖
救命样例过了0pts
638832
XXCCVV楼主2023/3/31 13:18
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;

struct edge {
	int next,to;
	double w;
} edges[100005];

int n,m,s,endd;
int cnt,head[10005],vis[10005];
double dis[10005];

void addEdge(int u,int v,double w) {
	edges[++cnt].to=v;
	edges[cnt].w=w;
	edges[cnt].next=head[u];
	head[u]=cnt;
}

void dij(int start) {
	priority_queue<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int> > >que;
	memset(dis,-0x3f,sizeof(dis));
	dis[start]=1;
	que.push(make_pair(1,start));
	while(!que.empty()) {
		int now=que.top().second;
		que.pop();
		if(vis[now])
			continue;
		vis[now]=1;
		for(int i=head[now]; i!=0; i=edges[i].next) {
			int to=edges[i].to;
			if(dis[to]<dis[now]*edges[i].w) {
				dis[to]=dis[now]*edges[i].w;
				que.push(make_pair(dis[to],to));
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
		int x,y;
		double z;
		cin>>x>>y>>z;
		addEdge(x,y,(double)(1-z/100));
		addEdge(y,x,(double)(1-z/100));
	}
	cin>>s>>endd;
	dij(s);
	printf("%.8lf",100/dis[endd]);
	return 0;
}

2023/3/31 13:18
加载中...