广元外国语的模拟赛(最短路)

来源:互联网 发布:大数据数据库设计 编辑:程序博客网 时间:2024/04/27 15:08
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1e4+10;
struct node{
 int cur,dis,kk;
};
priority_queue<node> q;
int n,m,k,s,t,a,b,c,head[2*maxn],
vis[2*maxn][15],v[2*maxn],w[2*maxn],nxt[2*maxn],cnt,d[maxn];
void add(int x,int y,int z){
 ++cnt; v[cnt]=y; w[cnt]=z; nxt[cnt]=head[x]; head[x]=cnt;
}
bool operator < (node xx,node yy){
 return xx.dis<yy.dis;
}
inline int read(){
 int num=0; char ch=getchar();
 while(ch<'0'||ch>'9') ch=getchar();
 while(ch>='0'&&ch<='9'){
  num=num*10+ch-'0'; ch=getchar(); 
 }
 return num;
}
int main(){
 //q.pop(); q.pop();
 n=read(),m=read(),k=read(),s=read(),t=read();
 for(int i=1;i<=m;i++){
  a=read(),b=read(),c=read();
  add(a,b,c); add(b,a,c);
 }
 for(int i=1;i<=n;i++){
  for(int j=head[i];i;j=nxt[j]){
   cout<<i<<" -> "<<v[j]<<endl; 
  } 
 }
 //cout<<1<<endl;
 node now1; now1.cur=s; now1.dis=0; now1.kk=0; q.push(now1);
 memset(d,0x3f,sizeof(d));
 d[s]=0;
 //cout<<2<<endl;
 while(!q.empty()){
  node now; now=q.top(); q.pop();
  int p=now.cur,qq=now.kk,dis1=now.dis;
  cout<<p<<' '<<qq<<' '<<dis1<<endl;
  if(vis[p][qq]) continue;
  vis[p][qq]=true;
  for(int i=head[p];i;i=nxt[i]){
   if(!vis[v[i]][qq]&&d[v[i]]>dis1+w[i]){
    d[v[i]]=dis1+w[i];
    node now2; now2.cur=v[i]; now2.kk=qq;
    now2.dis=dis1+w[i];
    q.push(now2);
   }
   if(qq<k&&!vis[v[i]][qq+1]&&d[v[i]]>dis1){
    node now2;
    d[v[i]]=dis1;
    now2.kk=qq+1; now2.dis=dis1;
    q.push(now2);
   }
  }
 }
 cout<<d[t]<<endl;
 return 0;
}