dijkstra堆优化模板

#include<bits/stdc++.h>
using namespace std;
int xx,yy,vv,dis[510],len=0,lin[510],T,n,m;
bool vis[510];
struct one
{
int y,v,next;
};
one e[20100];
//priority_queue < pair < int , int > , vector , greater > q;
priority_queue < pair < int , int > > q;
void insert()
{
e[++len].y=yy;e[len].v=vv;
e[len].next=lin[xx];lin[xx]=len;
}
int main()
{
//freopen(“xf.in”,“r”,stdin);
//freopen(“xf.out”,“w”,stdout);
scanf("%d%d%d",&T,&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&xx,&yy,&vv);
insert();swap(xx,yy);insert();
}
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
q.push(make_pair(0,1));
while(q.size())
{
int x=q.top().second;q.pop();
if(vis[x])continue;
vis[x]=true;
for(int i=lin[x];i;i=e[i].next)
{
if(dis[e[i].y]>dis[x]+e[i].v)
{
dis[e[i].y]=dis[x]+e[i].v;
q.push(make_pair(-dis[e[i].y],e[i].y));
}
}
}
int sum=0;
for(int i=1;i<=n;i++)printf("%d\n",dis[i]);
return 0;
}
/*#include
#include
#include
#include
#include
#include
#include
using namespace std;
int t,f,p,x[510][510],dis[11000],vis[11000],sum=0;
void dijkstra(int st)
{
for(int i=1;i<=f;i++) dis[i]=x[st][i];
memset(vis,0,sizeof(vis));
vis[st]=1;dis[st]=0;
for(int i=2;i<=f;i++)
{
int minn=999999999;
int k=0;
for(int j=1;j<=f;j++)
if(vis[j]0&&dis[j]<minn)
{
minn=dis[j];
k=j;
}
if(k
0) return;
vis[k]=1;
for(int j=1;j<=f;j++)
{
if(vis[j]==0&&dis[k]+x[k][j]<dis[j])
{
dis[j]=dis[k]+x[k][j];
}
}
}

}
int main()
{
memset(dis,9,sizeof(dis));
memset(x,9,sizeof(x));
scanf("%d%d%d",&t,&f,&p);
for(int i=1;i<=p;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(x[a][b]>c)
{
x[a][b]=c;
x[b][a]=c;
}
}
dijkstra(1);
for(int i=1;i<=f;i++)
if(dis[i]<=t) sum++;
cout<<sum<<endl;
return 0;
}*/
有相同爱好的可以进来一起讨论哦:企鹅群号:1046795523

学习视频资料:http://www.makeru.com.cn/live/1392_1164.html?s=143793

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值