poj 3268 Silver Cow Party(最短路径)
2016-01-27 11:34
330 查看
题意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出。
思路:最短路径只需要从x到i的最短路径代表他们返回的最短路径,然后将所有边反过来,再从x到i的最短路径代表他们来参加聚会的最短路径,这样对应相加找出一个最大值就可以了,当然其实不需要将所有边反过来,只需要将map的行和列对换一下就可以了,数据比较大,floyd超时,用dijkstra比较好点。
思路:最短路径只需要从x到i的最短路径代表他们返回的最短路径,然后将所有边反过来,再从x到i的最短路径代表他们来参加聚会的最短路径,这样对应相加找出一个最大值就可以了,当然其实不需要将所有边反过来,只需要将map的行和列对换一下就可以了,数据比较大,floyd超时,用dijkstra比较好点。
#include <iostream> #include <stdio.h> using namespace std; #define MAXV 1010 #define inf 1<<29 int map[MAXV][MAXV],d[MAXV],dback[MAXV]; bool vis[MAXV]; int n,m,x; int dijkstra(){ int i,j,v,mi; for(i=1;i<=n;i++){ vis[i]=0; d[i]=map[x][i]; dback[i]=map[i][x]; } for(i=1;i<=n;i++){ mi=inf; for(j=1;j<=n;j++) if(!vis[j] && d[j]<mi){ v=j; mi=d[j]; } vis[v]=1; for(j=1;j<=n;j++){ if(!vis[j] && map[v][j]+d[v]<d[j]) d[j]=map[v][j]+d[v]; } } for(i=1;i<=n;i++) vis[i]=0; for(i=1;i<=n;i++){ mi=inf; for(j=1;j<=n;j++) if(!vis[j] && dback[j]<mi){ v=j; mi=dback[j]; } vis[v]=1; for(j=1;j<=n;j++){ if(!vis[j] && map[j][v]+dback[v]<dback[j]) dback[j]=map[j][v]+dback[v]; } } mi=-1; for(i=1;i<=n;i++){ if(d[i]+dback[i]>mi) mi=d[i]+dback[i]; } return mi; } int main(){ int i,a,b,c,j; while(~scanf("%d%d%d",&n,&m,&x)){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++) if(i!=j) map[i][j]=inf; else map[i][j]=0; } for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); map[a][b]=c; } printf("%d\n",dijkstra()); } return 0; }
相关文章推荐
- Android基础之Animation——补间动画学习
- iOS开发-UI控件:UIImagePickerController 视频录制操作,视频大小,时间长度
- linux中查找文件并合并文件
- 源码来袭!!!基于jquery的ajax分页插件(demo+源码)
- setBackground报错 不兼容4.1以下版本
- linux终端快捷键
- 编程日常160127
- Hive-3.hive 的 hql 语句
- 享元模式
- [LeetCode] Count of Range Sum 区间和计数
- SQL Server 中截取字符串常用的函数
- CentOS 6.5安装MySQL中文乱码问题解决
- C++【String类】String删除单个字符,删除字符串的函数实现
- iOS开发-基础:监听app从后台恢复到前台
- 运算符优先级
- Android studio SweetAlert for Android
- 从 IT 中断中学到的最佳监控实践
- li中包含div内容越界问题
- AngularJS转换响应内容
- 从 IT 中断中学到的最佳监控实践