Tyvj专题 P1159 玛丽卡
来源:互联网 发布:win10 64位下载 知乎 编辑:程序博客网 时间:2024/05/22 15:45
P1159题目
题意不太好理解,但理解之后思路就很清晰了:先找最短路,存储这条路上的边,然后每次删除一条边,做最短路,求出这些最短路中的最大值。
数据很坑,首先要自己计算出边数,然后注意INF的取值。并且由于这是无向图,每次要修改两条边的状态,利用异或可以很方便的做到这点。
#include<iostream>#include<vector>#include<queue>#include<algorithm>#include<bitset>using namespace std;const int MAXN=1000000,INF=1<<30;struct edge{ int u,v,w;};vector<int> g[MAXN+3];vector<edge> es;queue<int> q;bitset<MAXN+3> inq,del;int n,m,dist[1000+3],pa[MAXN+3],ans=0;bool b=true;void add(int u,int v,int w){ es.push_back((edge){u,v,w}); es.push_back((edge){v,u,w}); g[u].push_back(es.size()-2); g[v].push_back(es.size()-1);}void read(){ int a,b,c; cin>>n>>m; for(int i=1;i<=m;i++){ cin>>a>>b>>c; add(a,b,c); }}void spfa(int from){ inq=0;inq[from]=1; for(int i=1;i<=n;i++)dist[i]=INF; dist[from]=0; q.push(from); while(!q.empty()){ int t=q.front();q.pop();inq[t]=0; for(int i=0;i<g[t].size();i++){ edge &e=es[g[t][i]]; if(del[g[t][i]])continue; if(dist[e.v]>dist[t]+e.w){ dist[e.v]=dist[t]+e.w; if(b)pa[e.v]=g[t][i]; if(!inq[e.v]){ inq[e.v]=1; q.push(e.v); } } } }}int main(){ ios::sync_with_stdio(false); read(); del=0; spfa(1); ans=dist[n]; b=false; for(int i=pa[n];i!=0;i=pa[es[i].u]){ del[i]=1;del[i^1]=1; spfa(1); ans=max(ans,dist[n]); del[i]=0;del[i^1]=0; } cout<<ans; return 0;}
0 0
- Tyvj专题 P1159 玛丽卡
- Tyvj专题 P1004 滑雪
- Tyvj专题 P1005 采药
- Tyvj专题 数字三角形
- 玛丽卡
- 玛丽卡
- 玛丽卡
- Tyvj专题 P1003 越野跑
- Tyvj专题 P1337 fibonacci数列
- Tyvj专题 P1083 分糖果
- Tyvj专题 P1094 矩形分割
- Palindrome (P1159)
- 【最短路】玛丽卡
- wikioi 1021 玛丽卡
- 【wikioi1021】 玛丽卡
- Codevs1021玛丽卡题解
- Codevs1021 玛丽卡
- Codevs 1021 玛丽卡
- 寒假学习总结
- OpenWorm
- Tyvj专题 数字三角形
- KMP算法
- C# 类以及对象
- Tyvj专题 P1159 玛丽卡
- oracle 11g忘记sys用户密码
- Leetcode: Minimum path sum
- CF_292_D_ Drazil and Tiles_贪心、dfs
- Tyvj专题 P1337 fibonacci数列
- VC++动态链接库(DLL)编程深入浅出(zz)
- 【JAVA实现】基于皮尔逊相关系数的相似度计算
- HDU 5176 The Experience of Love (带权并查集 + 贪心)
- LeetCode-Sort List