09.14总结
今天花了一个晚上做最小花费
事实上我前两天就一直在做了,一直re也不知道到底什么原因
floyed和dijkstra都试过了
所以今天又重新打了一遍,仍然re。。。
然后我就翻了题解,找了一个用dijkstra的,对照着把小错误一个一个改掉,然后测试,还是re。。。
我几乎要以为洛谷出问题了,最后终于让我找着了
原来是范围没找对,开心的改了范围然后测试,哇声一片。。
再找,发现漏了一个小条件。。。
下面上代码
#include<bits/stdc++.h>
using namespace std;
int m,n,a,b,A,B;
double c,p[2002][2002]={},sum,dis[2002]={};
bool f[2002]={};
void init()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
c=1-0.01*c;
p[a][b]=p[b][a]=c; //这里我可能抽风了只打了p[b][a]=c,漏了条件;
}
cin>>A>>B; //这里一开始居然没有输入,大罪。。
}
void dijkstra(int st)
{
for(int i=1;i<=n;i++)
dis[i]=p[st][i];
f[st]=1;dis[st]=0;
for(int i=1;i<n;i++) //重点就在这里,范围全部打成i<m;说白了还是没理解dijkstra的用法;
{
int k=0;
double max=0;
for(int j=1;j<=n;j++)
if(!f[j]&&dis[j]>max) max=dis[j],k=j;
if(k==0) return;
f[k]=1;
for(int j=1;j<=n;j++)
if(!f[j]&&dis[k]*p[k][j]>dis[j]) dis[j]=dis[k]*p[k][j];
}
}
int main()
{
init();
dijkstra(B);
sum=100/dis[A];
printf("%.8lf",sum);
return 0;
}

浙公网安备 33010602011771号