【codevs1021】玛丽卡,以前屯着的最短路
2016-02-17 15:12
288 查看
传送门
写在前面:以前屯着的一个最短路,感觉有点恶心o_O
思路:最初用的堆优化dijskra+邻接矩阵,结果T了3组,就放在那里了。现在捡起来用了SPFA+邻接表枚举所有边,T了2组,然后想到先求出最短路,枚举最短路径上的边就可以了,但是调了半天都不对,最后发现是循环变量名打错了……
代码:
写在前面:以前屯着的一个最短路,感觉有点恶心o_O
思路:最初用的堆优化dijskra+邻接矩阵,结果T了3组,就放在那里了。现在捡起来用了SPFA+邻接表枚举所有边,T了2组,然后想到先求出最短路,枚举最短路径上的边就可以了,但是调了半天都不对,最后发现是循环变量名打错了……
代码:
#include<bits/stdc++.h> using namespace std; int tot,n,m,ans; int first[1010],dis[1010],up[1010],e[1010];//up记录最短路径上每个点的入度边,e则是记录最短路径上的边 bool flag[1010]; struct os { int fa,son,next,w; }a[1000010]; void add(int x,int y,int z) { a[++tot].fa=x; a[tot].son=y; a[tot].w=z; a[tot].next=first[x]; first[x]=tot; } main() { scanf("%d%d",&n,&m); queue<int> q; 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); } //读入 memset(dis,63,sizeof(dis)); dis[1]=0; q.push(1); flag[1]=1; while (!q.empty()) { int t=q.front(); flag[t]=0; q.pop(); for (int i=first[t];i;i=a[i].next) { int p=a[i].son; if (dis[t]+a[i].w<dis[p]) { dis[p]=dis[t]+a[i].w; up[p]=i; if (!flag[p]) q.push(p),flag[p]=1; } } } //SPFA求最短路 for (int i=up ;i;i=up[a[i].fa]) e[++e[0]]=i; //从n倒着走,求出最短路径并记录在e中 for (int i=1;i<=e[0];i++) { int k=a[e[i]].w; a[e[i]].w=0x7fff; if (e[i]%2==0) a[e[i]-1].w=0x7fff; else a[e[i]+1].w=0x7fff;//这里也可以用xor,不过最初的路径编号要为0 memset(dis,63,sizeof(dis)); dis[1]=0; q.push(1); flag[1]=1; while (!q.empty()) { int t=q.front(); flag[t]=0; q.pop(); for (int j=first[t];j;j=a[j].next) { int p=a[j].son; if (dis[t]+a[j].w<dis[p]) { dis[p]=dis[t]+a[j].w; if (!flag[p]) q.push(p),flag[p]=1; } } } if (dis <0x7fff) ans=max(ans,dis ); a[e[i]].w=k; if (e[i]%2==0) a[e[i]-1].w=k; else a[e[i]+1].w=k; } //去掉最短路径上的边后再求最短路就行了 printf("%d",ans); }
相关文章推荐
- python 算法基础查找和二维数组转换
- loadScript,非阻塞 JavaScript 加载库
- Tomcat报错—Tomcat内存溢出及大小调整
- 高德地图API KEY出现INVALID_USER_SCODE的解决过程
- 配置gosublime
- 导航属性(外键)
- 解决:本地测试wordpress安装主题需要FTP问题
- Spring MVC和Struts2的比较
- 分治法(divide & conquer algorithm)的理解
- 灵活运用IOS类别(Category)和扩展(Extension)
- unity3d深入学习笔记4:AnySdk接入
- iOS storyboard tableview 内容下移64
- Errore Http 404.2
- iOS plist文件创建
- Spring中MultipartHttpServletRequest实现文件上传
- Screen命令
- invalidate()与postInvalidate()
- 在ubuntu上搭建git-server及android studio使用git
- unity3d深入学习笔记3:项目生命周期
- UIImagePickerController全面使用详解