SPFA——玛丽卡

来源:互联网 发布:浙大网新恒天软件福利 编辑:程序博客网 时间:2024/05/21 01:46

题目来源

洛谷P1186玛丽卡

https://www.luogu.org/problem/show?pid=1186


思路

建图 在原图上用SPFA求城市N到城市1的最短路长度ans 记录最短路路径

枚举删去最短路路径中一条边的情况 求删去此边后的最短路(SPFA)

如果此时的最短路大于ans ans变为此时的最短路长度

最后 ans即为所求答案


代码(C++)

#include <cstdio>#include <queue>#include <bitset>#define N 1010#define M 1000010using namespace std;bitset<N> in;  queue<int> q;long long dis[N]={0},ans=0;int n,m,u,v,w,cnt=0,pos,he[N],f[N];int en[M],ne[M],len[M],fr[M];inline void add();int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;++i)scanf("%d%d%d",&u,&v,&w),add();for(int j=1;j<n;++j)dis[j]=9223372036854775807;f[n]=0;    in[n]=1; q.push(n);while(!q.empty()){pos=q.front(); q.pop(); in[pos]=0;for(int k=he[pos];k!=0;k=ne[k])if(dis[pos]+len[k]<dis[en[k]]){dis[en[k]]=dis[pos]+len[k];f[en[k]]=k;if(in[en[k]]==0)q.push(en[k]),in[en[k]]=1;}}ans=dis[1];for(int i=f[1];i!=0;i=f[fr[i]]){for(int j=1;j<n;++j)dis[j]=9223372036854775807;in=0;   in[n]=1; q.push(n);while(!q.empty()){pos=q.front(); q.pop(); in[pos]=0;for(int k=he[pos];k!=0;k=ne[k])if(k!=i&&dis[pos]+len[k]<dis[en[k]]){dis[en[k]]=dis[pos]+len[k];if(in[en[k]]==0)q.push(en[k]),in[en[k]]=1;}}if(dis[1]>ans)ans=dis[1];}printf("%lld",ans);return 0;}inline void add(){en[++cnt]=v;len[cnt]=w;ne[cnt]=he[u];he[u]=cnt;   fr[cnt]=u;en[++cnt]=u;len[cnt]=w;ne[cnt]=he[v];he[v]=cnt;   fr[cnt]=v;}



原创粉丝点击