求助!最后两个点不加O2怎么过?悬赏互关
查看原帖
求助!最后两个点不加O2怎么过?悬赏互关
778629
weixizhao1111楼主2023/4/16 15:31

#include <bits/stdc++.h>
using namespace std;
struct node
{
	int id;
	double cc;
	friend bool operator<(const node &x,const node &y)
	{
		return x.cc<y.cc;
	}
};
priority_queue<node>q;
struct edge 
{
	int to;
	double cost;
};
vector<edge>G[100010];
int n,m,a1,s,a,b2;
double dist[2010];
void dij()
{
	for(int i=1;i<=n;i++)
	{
		dist[i]=100000000;
	}
	dist[s]=100;
	node st;
	st.cc=0;
	st.id=s;
	q.push(st);
	while(!q.empty())
	{
		node now=q.top();
		q.pop();
		int v=now.id;
		if(dist[v]<now.cc)
		{
			continue;
		}
		for(int i=0;i<G[v].size();i++)
		{
			edge e=G[v][i];
			double cost = dist[v] / e.cost;
			if(dist[e.to]>cost)
			{
				dist[e.to]=cost;
				node nxt;
				nxt.cc=dist[e.to];
				nxt.id=e.to;
				q.push(nxt);
			}
		}
	}
}
int main()
{
	//freopen("P1576_1.in","r",stdin);
	cin>>n>>m;
	//printf("%d, %d\n", n, m);
	for(int i=1;i<=m;i++)
	{
		double c;
		edge b;
		cin>>a>>b2>>c;
//		printf("%d, %d\n", a, b2);
//		if(a == b2)
//		{
//			continue;
//		}
		b.to=a;
		b.cost=(1-c/100);      
		G[b2].push_back(b);
		b.to=b2;
		G[a].push_back(b);
	}
	cin>>a1>>s;
//	printf("%d\n", G[s].size());
	dij();
	printf("%.8f",dist[a1]);
	return 0;
} 

不开O2 1.2s 开了357ms 求助优化!

2023/4/16 15:31
加载中...