poj3268
来源:互联网 发布:火箭引擎 知乎 编辑:程序博客网 时间:2024/05/17 08:19
题目名称:Silver Cow Party
题目链接:http://poj.org/problem?id=3268
题意:有n个农场和m条单向的路和每条路通过所要的时间,除X外其他农场的牛都来X农场开party,结束都各自回家,问所有牛各自所花最短时间中 那个最大的时间是多少
思路:先正着求最短路然后再反过来求一次
代码如下:
#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<queue>#include<vector>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1001;int dis[maxn][maxn];int d[maxn];bool inque[maxn];vector<int> vr[maxn];int n,m,x;void spfa(){ memset(inque,false,sizeof(inque)); queue<int> Q; Q.push(x); inque[x]=true; d[x]=0; while(!Q.empty()) { int u=Q.front(); Q.pop(); inque[u]=false; for(int v=1;v<=n;v++) { if(d[v]>d[u]+dis[u][v]) { d[v]=d[u]+dis[u][v]; if(!inque[v]) { inque[v]=true; Q.push(v); } } } }}void Traverse(){ int i,j,tmp; for(i=1;i<=n;i++) { for(j=1;j<i;j++) { tmp=dis[i][j]; dis[i][j]=dis[j][i]; dis[j][i]=tmp; } }}int main(){ while(scanf("%d%d%d",&n,&m,&x)!=EOF) { int u,v,w; int dist[maxn]; memset(dis,INF,sizeof(dis)); memset(d,INF,sizeof(d)); for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); if(w<dis[u][v]) { dis[u][v]=w; } } spfa(); //求去X的最短路 for(int i=1;i<=n;i++) { dist[i]=d[i]; } Traverse(); //反转 memset(d,INF,sizeof(d)); spfa(); //求回家的最短路 int sum=0; for(int i=1;i<=n;i++) { sum=max(sum,d[i]+dist[i]); } printf("%d\n",sum); } return 0;}
0 0
- poj3268
- poj3268
- poj3268
- poj3268
- POJ3268
- poj3268
- poj3268
- poj3268
- POJ3268
- poj3268
- poj3268
- poj3268
- poj3268
- POJ3268
- poj3268
- poj3268
- poj3268---spfa
- POJ3268 SPFA
- 南邮 OJ 1029 短语搜索
- HDU5335 Walk Out(dfs+递推)
- 阿里云Ubuntu系统+Apache2+PHP搭建gitblog
- java多线程(二) 多线程的同步
- Android实现拍照或从相册中选择照片并截取
- poj3268
- ibatis排序无效的一种情况的解决办法
- java操作excel2010时无法找到WorkbookFactory类
- 在北京打拼的意义
- 南邮 OJ 1030 ACM程序设计之马拉松竞赛
- poj2246--数据结构栈
- c++阅读源代码方法
- Android中异步任务的操作
- IOS开发之实现App消息推送(最新)