hdu 2066 Dijstra 堆优化

嗯 有广搜的意思  

#include<cstdio> #include<iostream> #include<queue> #include<vector> #define maxn 1001 #define inf 9999999
using namespace std; struct vec //这里用邻接矩阵的方式比较浪费空间 所以用邻接表 这里是带权图 所以用结构体构图 { int point,cost; friend bool operator<(vec a,vec b) { return a.cost>b.cost; } }; int t,s,d,sta[maxn],en[maxn],dis[maxn]; vector<vec> fuck[maxn]; void init() { fill(dis,dis+maxn+1,inf); for(int i=1;i<=maxn;i++) fuck[i].clear(); } void dij(int ss) { priority_queue<vec> q; dis[ss]=0; vec temp; temp.point=ss; temp.cost=0; q.push(temp); while(!q.empty())//广度更新 每次取出离起点最近的点 { temp=q.top(); q.pop(); int v=temp.point; if(dis[v]<temp.cost) continue; for(int i=0;i<fuck[v].size();i++)//更新顶点周围点的距离 { vec ret=fuck[v][i]; if(dis[ret.point]>dis[v]+ret.cost)//如果临近的点的距离可以更新 { dis[ret.point]=dis[v]+ret.cost; ret.cost=dis[ret.point]; q.push(ret); } } } } int main() { while(cin>>t>>s>>d) { init(); // cout<<t<<s<<d<<endl; while(t--) { int a,b,c; cin>>a>>b>>c; vec temp; temp.cost=c; temp.point=b; fuck[a].push_back(temp); temp.point=a; fuck[b].push_back(temp); } for(int i=1;i<=s;i++) cin>>sta[i]; for(int i=1;i<=d;i++) cin>>en[i]; int mins=0; for(int i=1;i<=s;i++) { dij(sta[i]); mins=inf; for(int j=1;j<=d;j++) mins=min(mins,dis[en[j]]); } cout<<mins<<endl; } return 0; }

转载于:https://www.cnblogs.com/z1141000271/p/5803471.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值