Magical Girl Haze(分层最短路)
2019-08-07 本文已影响2人
雨落八千里

Magical Girl Haze
注意这个是单向的,搞了半天,没看懂英文
#include<bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
const int M=6*1000000+10;
int head[M],cnt;
int vis[M];
ll dis[M];
int n,m,k;
struct node
{
int v;
ll w;
int nxt;
} edge[M];
void add(int x,int y,ll w)
{
edge[++cnt].nxt=head[x];
edge[cnt].v=y;
edge[cnt].w=w;
head[x]=cnt;
}
struct mul
{
int id;
ll w;
friend bool operator <(mul x,mul y)
{
return x.w>y.w;
}
};
void Dijkstra(int x)
{
mul now;
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
dis[x]=0;
priority_queue<mul>qu;
//priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > qu;
now.id=x;
now.w=0;
qu.push(now);
//qu.push(make_pair(0,x));
while(!qu.empty( ))
{
//int u=qu.top( ).second;
now=qu.top( );
int u=now.id;
qu.pop( );
if(!vis[u])
{
vis[u]=1;
for(int i=head[u]; i!=-1; i=edge[i].nxt)
{
int v=edge[i].v;
if(dis[v]>edge[i].w+dis[u])
{
dis[v]=edge[i].w+dis[u];
now.id=v;
now.w=dis[v];
qu.push(now);
//qu.push(make_pair(dis[v],v));
}
}
}
}
}
int main( )
{
int t,x,y;
ll w;
scanf("%d",&t);
while(t--)
{
memset(head,-1,sizeof(head));
cnt=0;
scanf("%d%d%d",&n,&m,&k);
for(int i=1; i<=m; i++)
{
scanf("%d%d%lld",&x,&y,&w);
for(int j=0; j<=k; j++)
{
add(x+j*n,y+j*n,w);
//add(y+j*n,x+j*n,w);
}
for(int j=1; j<=k; j++)
{
add(x+(j-1)*n,y+j*n,0);
//add(y+(j-1)*n,x+j*n,0);
}
}
Dijkstra(1);
ll ans=INF;
//cout<<INF<<endl;
for(int i=0; i<=k; i++)
{
ans=min(ans,dis[n+i*n]);
}
printf("%lld\n",ans);
}
return 0;
}