这题能有绿?
#include<bits/stdc++.h>
#define ri register int
#define maxn 51
#define maxm 1001
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;register bool f=0;register char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')f=1,c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
x=f?-x:x;
}
const int inf=2e9;
int n,m,k,tot,h[maxn],dis[maxn];
struct node{int pos,spc,dis;};
queue<node>q;
struct edge
{
int next,v,w;
}e[maxm<<2];
inline void add(int x,int y,int z)
{
e[++tot].next=h[x];
h[x]=tot;
e[tot].v=y;
e[tot].w=z;
}
inline void spfa()
{
for(ri i=1;i<=n;i++)dis[i]=inf;
dis[1]=0;
q.push((node){1,k,0});
while(!q.empty())
{
node u=q.front();
q.pop();
ri x0=u.pos,c0=u.spc,d0=u.dis;
if(d0<dis[x0])dis[x0]=d0;
for(ri i=h[x0];i;i=e[i].next)
{
ri x1=e[i].v,d1=e[i].w;
if(d0+d1/2<dis[x1]&&c0>0)q.push((node){x1,c0-1,d0+d1/2});
if(d0+d1<dis[x1])q.push((node){x1,c0,d0+d1});
}
}
}
int main()
{
read(n);
read(m);
read(k);
ri x0,y0,z0;
for(ri i=1;i<=m;i++)
{
read(x0);
read(y0);
read(z0);
add(x0,y0,z0);
add(y0,x0,z0);
}
spfa();
printf("%d",dis[n]);
return 0;
}
超级朴素的 SPFA,连 vis 剪枝都没有,就靠几个我自己都不太明白的 if 都能过。SPFA 题数据过水,再一次证明了这种算法已死。