[JLOI2011]飞行路线
这是一道神题。。。为什么呢。。。这是我迄今为止。。。唯一一道在BZOJ上A掉。。。但是luogu上不A的题
这道题。。。思路清晰明了。。。分层图。。。枚举那条边归零。。。
luogu上卡SPFA。。。然而。。。BZOJ上不应该是一样的数据吗。。。/(ㄒoㄒ)/~~
呆码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 200010 using namespace std; struct asd{ int nxt; int to; int dis; } a[maxn]; struct sdf{ int time,pont; sdf(int a,int b):time(a),pont(b){} sdf(){} }; int head[maxn],dis[11][maxn],num,k,ans=2147483647,s,t,n,m; bool use[11][maxn]; queue <sdf> q; inline void add(int x,int y,int z) { a[++num].nxt=head[x]; a[num].to=y; a[num].dis=z; head[x]=num; } inline void spfa(int u) { memset(dis,127,sizeof(dis)); // int headd=0,taill=0; // temp[++taill].time=0; temp[taill].pont=u; q.push(sdf(0,u)); dis[0][u]=0; use[0][u]=1; // while(headd<taill) while(!q.empty()) { // int now=temp[++headd].pont,j=temp[headd].time; sdf j=q.front(); q.pop(); use[j.time][j.pont]=0; for(int i=head[j.pont];i;i=a[i].nxt) { int to=a[i].to; if(dis[j.time][to]>dis[j.time][j.pont]+a[i].dis) { dis[j.time][to]=dis[j.time][j.pont]+a[i].dis; if(!use[j.time][to]) { // temp[++taill].pont=to; // temp[taill].time=j; q.push(sdf(j.time,to)); use[j.time][to]=1; } } } if(j.time<k) { for(int i=head[j.pont];i;i=a[i].nxt) { int to=a[i].to; if(dis[j.time+1][to]>dis[j.time][j.pont]) { dis[j.time+1][to]=dis[j.time][j.pont]; if(!use[j.time+1][to]) { // temp[++taill].pont=to; // temp[taill].time=j+1; q.push(sdf(j.time+1,to)); use[j.time+1][to]=1; } } } } } for(int i=0;i<=k;i++) ans=min(ans,dis[i][t]); } int main() { scanf("%d%d%d",&n,&m,&k); // scanf("%d%d",&s,&t); s=1; t=n; int x,y,z; for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } spfa(s); printf("%d\n",ans); return 0; }