最后两个数据TLE怎么解
查看原帖
最后两个数据TLE怎么解
802078
TommyGosling楼主2022/10/29 23:11
最后两组数据TLE了,**模板是堆优化的dijkstra**,倒数第二组数据提醒的是**输入长度不合法**,但是我看着数组的大小是没问题的,不知道到底是哪里有问题。求dalao们帮忙看看解决一下Orz
(有很多//注释是用来调试的,请忽略)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;

const int N=200010;
typedef pair<double,int> PII;
int n,m,A,B;
double dist[N];
int h[N],e[N],ne[N],idx;
double w[N];
bool st[N];
//邻接表
void add(int x,int y,double z)
{
  //cout<<z<<endl;
  e[idx]=y,w[idx]=z,ne[idx]=h[x],h[x]=idx++;
  //cout<<w[idx-1]<<endl;
}

double dijkstraII()
{
  memset(dist,0,sizeof dist);
  dist[A]=1;
  priority_queue<PII,vector<PII>> heap;
  heap.push({1,A});
  
  while(!heap.empty())
  {
      auto t = heap.top();
      heap.pop();
      
      int ver=t.second;double distance = t.first;

      //cout<<ver<<" "<<distance<<endl;

      //if(st[ver]) continue;
      //cout<<"到这里来了吗"<<endl;
      for(int i=h[ver];i!=-1;i=ne[i])
      {
          int j=e[i];
          if(dist[j]<distance*w[i])
          {
              //if(ver == 2) cout<<distance*w[i]<<endl;
              dist[j]=distance*w[i];

              //cout<<j<<" "<<dist[j]<<endl;

              heap.push({dist[j],j});
              st[j]=true;
          }
      }
  }
  //cout<<dist[B]<<endl;
  return dist[B];
}

int main()
{
  //cin>>n>>m;
  scanf("%d%d",&n,&m);
  memset(h,-1,sizeof h);
  int a,b,c;
  for(int i=1;i<=m;i++)
  {
      //cin>>a>>b>>c;
      scanf("%d%d%d",&a,&b,&c);
      add(a,b,1-c*0.01),add(b,a,1-c*0.01);
  }
  //cin>>A>>B;
  scanf("%d%d",&A,&B);
  //double ans = 100 / dijkstraII();
  //cout<<ans<<endl;
  printf("%.8f",100 / dijkstraII());
  return 0;
}
2022/10/29 23:11
加载中...