迪杰斯特拉算法 比赛的时候我没有用堆优化 有两个样例一直超时
传送门
堆优化后的代码 把边权最小的边放在堆顶就可以了 记得用vis标记一下 比赛的时候也忘了标记了
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int N=1e6;
long long e[5*N+100],h[5*N+100],nx[5*N+100],w[5*N+100],vis[N*4+100];
long long dis[3*N+100],cnt=0;
priority_queue<pr,vector<pr>,greater<pr> >q;
void add(int x,int y,int z)
{
e[cnt]=y,nx[cnt]=h[x],w[cnt]=z,h[x]=cnt++;
e[cnt]=x,nx[cnt]=h[y],w[cnt]=z,h[y]=cnt++;
}
void bfs(int x)
{
dis[x]=0;
q.push({0,1});
int i;
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u])
continue;
vis[u]=1;
for(i=h[u];~i;i=nx[i])
{
int j=e[i];
if(dis[j]>dis[u]+w[i]&&!vis[j])
{
// printf("*** %d %d\n",j,dis[u]+w[i]);
dis[j]=dis[u]+w[i];
q.push({dis[j],j});
// vis[j]=1;
}
}
}
}
int main()
{
int i,j,k,m,n,a,b,c;
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
memset(dis,0x3f3f3f3f,sizeof(dis));
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
bfs(1);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&a,&b);
printf("%lld\n",dis[a]+dis[b]);
}
}