福慧雙修 探險 BZOJ4398 BZOJ2407

2022-04-30 11:30:11 字數 1052 閱讀 2947

分析:

雙倍經驗(資料範圍不同)。

我們考慮,我們必定是從1走一條邊到節點i,之後從i到j跑最短路,之後再從j到1走另一條邊的情況下,不會重複,並且是答案。那麼我們考慮預處理出pre[i]表示從1走到i滿足最短路的並且經過pre[i],pre[i]為路徑第二個節點。那麼,針對每乙個邊,(x,y,z,v)滿足當x!=1&&y!=1時,如果pre[x]!=pre[y]連線1,x,dis[y]+z和1,y,dis[x]+v(因為答案如果經過這個邊,那麼答案一定是dis[x]+dis[y]+z或者dis[x]+dis[y]+v中的乙個),如果pre[x]==pre[y],那麼保留這兩條邊。需要特判x==1||y==1的情況,具體看**。

附上**:

#include #include #include #include #include #include #include #include using namespace std;

#define n 10010

struct node

e[600010];

int dis[n],pre[n],vis[n],head[n],cnt,n,m;

void add(int x,int y,int z)

void spfa()

} }//printf("%d %d %d\n",dis[1],dis[2],dis[3]);

}struct no

a[400010];

int main()

spfa();

memset(head,-1,sizeof(head));cnt=0;

for(int i=1;i<=m;i++)

if(y==1)

if(pre[x]!=pre[y])add(1,y,dis[x]+z),add(1,x,dis[y]+v);

else add(x,y,z),add(y,x,v);

} for(int i=1;i<=n;i++)dis[i]=1<<30;

spfa();

printf("%d\n",dis[n+1]);

return 0;

}

種植福田 培植福報 福慧雙修 悟透自己!

種植福田 福慧雙修 悟透自己!悟透自己!人生在世,和 自己 相處最多,打交道最多,但是往往悟不透 自己 走上坡路時,往往把自己估計過高,認為一切都能唾手可得,甚至把運氣和機遇,也看作自己身價的一部分而喜不自勝。走下坡路時,又往往妄自菲薄,把自己估計過低,把困難和不利看作是自己的無能,而實際上是被怯懦...