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;
}

posted @ 2017-09-14 21:37  礿尧  阅读(80)  评论(0)    收藏  举报