bzoj 2763 [JLOI2011]飞行路线

来源:互联网 发布:c 编程 猜字小游戏 编辑:程序博客网 时间:2024/05/24 00:05
本题我用的二维spfa,dis[i][j]表示到i点用掉了j次免费机会的最优值,相当于动态规划,由于数据十分大,普通spfa会T掉3个点,所以考虑堆优化相信堆优化大家都懂,所以这些提示就够了#include<cstdio>#include<queue>#include<cstring>using namespace std;struct dd{int begin,end,juli,next;}jie[200000];struct pu{int id,cishu,sub;friend bool operator < (pu a,pu b){return a.sub>b.sub;}}wq;priority_queue<pu>que;int dis[10006][15],tot,n,m,k,a,b,c,head[10006],s,t;bool vis[10006][15];void add(int x,int y,int z){jie[++tot].end=y; jie[tot].juli=z; jie[tot].next=head[x]; head[x]=tot;}void spfa(int x){for(int i=0;i<=n;++i)  for(int j=0;j<=k;++j)  dis[i][j]=99999999;dis[x][0]=0; vis[x][0]=1;wq.id=x; wq.cishu=0; wq.sub=0;que.push(wq);while(!que.empty()){int yu=que.top().id;int lin=que.top().cishu;que.pop(); vis[yu][lin]=0;for(int i=head[yu];i!=-1;i=jie[i].next){int sf=jie[i].end;if(dis[sf][lin]>dis[yu][lin]+jie[i].juli){dis[sf][lin]=dis[yu][lin]+jie[i].juli;if(!vis[sf][lin]){vis[sf][lin]=1;wq.id=sf; wq.cishu=lin; wq.sub=dis[sf][lin];que.push(wq);}}if(lin+1<=k){   if(dis[sf][lin+1]>dis[yu][lin]){dis[sf][lin+1]=dis[yu][lin];if(!vis[sf][lin+1]){vis[sf][lin+1]=1;wq.id=sf; wq.cishu=lin+1; wq.sub=dis[sf][lin+1];que.push(wq);}   }}}}}int main(){freopen("meg.in","r",stdin);freopen("meg.out","w",stdout);memset(head,-1,sizeof(head));scanf("%d%d%d",&n,&m,&k);scanf("%d%d",&s,&t);for(int i=1;i<=m;++i){  scanf("%d%d%d",&a,&b,&c);  add(a,b,c); add(b,a,c);}spfa(s);printf("%d",dis[t][k]);return 0;}

0 0
原创粉丝点击