最短路_POJ_3268
2015-08-05 00:55
232 查看
/* 最短路 Dijkstra、 Ford: 先给距离赋值为oo,然后扫描所有边,对于起点距离不为oo更新终点距离 扫描n-1遍,之后如果还能有满足更新的条件,则表明有负环 Floyd: 每个点间的最短距离 k从1-n,k为转折点 每次跟新dis[u][v] > dis[u][k] + dis[k][v] SPFA: 先距离为oo,起点为0, 入队列,标记在队列中,标记进入队列次数,取出点,遍历跟新, 如果次数>n有环; n(1000)点,要去(x),有m(100000)条单向路,标记t(100)秒,问一个点到x,在从回来,最短的最大是多少 Floyd跑一遍,选择最大就好了吧,然而无情wa了 回头一想,n*n*n,2000ms也会暴掉啊,莫非暗藏玄机吗 x到其他点的最短路,Dijs跑一遍就好了,问题是其他点到x点的,总不能跑n次Dijs吧 据说只要把边反向一下,然后在来一遍D,那就是点到x的最短路,好有道理啊,反向之后,x出去的边就变成来的边,既可以反向进来 叼叼的感觉 */ #include<iostream> #include<cstdio> #include<cstring> #define Max(a,b) (a)>(b)?(a):(b) #define Min(a,b) (a)<(b)?(a):(b) #define oo 0x3f3f3f3f const int maxn = 1010; int mp[maxn][maxn],n,m,x; int dis[maxn],dis1[maxn],vis[maxn]; void Floyd() { for(int k = 1; k <= n; k++) { for(int u = 1; u <= n; u++) { for(int v = 1; v <= n; v++) { if(mp[u][k] != oo && mp[k][u] != oo) mp[u][v] = Min(mp[u][v], mp[u][k]+mp[k][v]); } } } } void Dijkstra(int s) { for(int i = 1; i <= n; i++) { dis[i] = mp[s][i]; vis[i] = 0; } vis[s] = 1; int mi ,k; for(int i = 0; i < n; i++) { mi = oo,k=s; for(int j = 1; j <= n; j++) { if(!vis[j]&&mi>dis[j]) { mi = dis[j]; k = j; } } if(k == s)continue; vis[k] = 1; for(int j = 1; j <= n; j++) { if(!vis[j] &&mp[k][j]!=oo) dis[j] = Min(dis[j], dis[k]+mp[k][j]); } } } int solve() { Dijkstra(x); memcpy(dis1,dis,sizeof(dis)); for(int i = 1; i <= n; i++) { for(int j = i+1; j<=n; j++) { mp[i][j] = mp[i][j] ^ mp[j][i]; mp[j][i] = mp[j][i] ^ mp[i][j]; mp[i][j] = mp[i][j] ^ mp[j][i]; } } Dijkstra(x); int ans = dis[1]+dis1[1]; for(int i = 1; i <= n; i++) { ans = Max(ans, dis[i]+dis1[i]); } return ans; } int main() { int u,v,val; while(scanf("%d%d%d",&n,&m,&x)!=EOF) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) if(i == j) mp[i][i] = 0; else mp[i][j] = oo; } while(m--) { scanf("%d%d%d",&u,&v,&val); if(mp[u][v]>val) mp[u][v] = val; } printf("%d\n",solve()); } return 0; }
相关文章推荐
- [LeetCode]Maximum Gapd
- iOS应用架构谈 开篇
- 最好最实用的二次开发教程(dedeCMS,ecshop为例)
- bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车
- 数据结构基础温故-6.查找(上):基本查找与树表查找
- 各种版本的ST-LINK仿真器
- inux Gsensor驱动(bma250为例子)
- MinGW-64 安装
- 欢迎使用CSDN-markdown编辑器
- POJ_3660
- Android开源:数据库ORM框架GreenDao学习心得及使用总结
- MTK6572 平台G_SEENSOR兼容
- 2015-08-04
- Android-ViewPagerIndicator框架使用——TitlePageIndicator
- Android4.0 G-Sensor工作流程
- 淘宝宝箱流量软件抽取方法(纯方法) 淘宝js研究
- Xcode小技巧
- Android-Gsensor屏幕旋转
- hdu4918 Query on the subtree
- Linux makefile 教程 非常详细 易懂