【codevs 1021】玛丽卡
来源:互联网 发布:vr核心算法 编辑:程序博客网 时间:2024/05/16 19:16
最短路问题。先找出1-n的最短路,依次把路上的一条路径去掉,求出并记录最短路,取最大值。
注意:去掉某一条路径时要先恢复上一条路径。
#include<cstdio>#include<queue>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=1000+5,maxm=500000+5;int n,m,s,t;bool vis[maxn],flag;int tot=0,first[maxn],next[maxm<<1],dis[maxn];int fa[maxn],fatot[maxm<<1];queue<int>q;struct edge{ int f,t,v;}es[maxm<<1];void build(int f,int t,int v){ es[++tot]=(edge){f,t,v}; next[tot]=first[f]; first[f]=tot;}void spfa(int s){ memset(vis,0,sizeof(vis));memset(dis,0x3f3f3f3f,sizeof(dis)); q.push(s); dis[s]=0; vis[s]=1; while(!q.empty()) { int v=q.front(); q.pop(); vis[v]=0; for(int i=first[v];i;i=next[i]) { int u=es[i].t; if(dis[u]>dis[v]+es[i].v) { dis[u]=dis[v]+es[i].v ; if(flag==1) { fatot[u]=i;//bian fa[u]=v;//dian } if(!vis[u]) { q.push(u); vis[u]=1; } } } }}int main(){ memset(fa,0,sizeof(fa)); int a,b,c; scanf("%d%d",&n,&m); s=1; t=n; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); build(a,b,c); build(b,a,c); } flag=1; spfa(s); flag=0; int ans=0; for(int i=n;i!=1;i=fa[i]) { int bian=fatot[i]; int dfg=es[bian].v; es[bian].v=0x3f3f3f3f; spfa(s); ans=max(ans,dis[t]); es[bian].v=dfg; } cout<<ans; return 0;}
阅读全文
0 0
- Codevs 1021 玛丽卡
- Codevs 1021 玛丽卡
- codevs 1021 玛丽卡
- 【codevs 1021】玛丽卡
- 【codevs 1021】玛丽卡
- codevs 1021 玛丽卡
- codevs 1021 玛丽卡
- CODEVS 1021 玛丽卡
- Codevs 1021 玛丽卡
- 【codevs 1021】玛丽卡
- codevs 1021 玛丽卡
- 【codevs 1021】玛丽卡
- 【CODEVS 1021】玛丽卡 SPFA+枚举
- codevs 1021 玛丽卡(spfa)
- codevs 1021 玛丽卡(spfa)
- codevs 1021 玛丽卡 解题报告
- codevs 1021 玛丽卡 图论:最短路
- Codevs 玛丽卡
- linux常用命令(locate,whereis,which,find,grep)
- openssh+xshell, sftp+winscp
- opengrok搭建
- 《大话数据结构》—第六章—树
- Tyvj1043
- 【codevs 1021】玛丽卡
- java多线程读取、操作List集合
- 我的逻辑思维
- 各种错误总结
- Python中文分词--jieba的基本使用
- C#基础-043 多态
- linux 操作命令: cp
- lua数据结构-数组
- 关闭Metrialize的模态框时的回调方法