题目链接:http://poj.org/problem?id=3268

题意 :有N头奶牛,M条单向路。X奶牛开party,其他奶牛要去它那里。每头奶牛去完X那里还要返回。去回都是走的最短路。现在问这里面哪头奶牛走的路最长。

题解:对每个奶牛i与X做两次spfa。去回各一次。然后统计最长的。。板子稍微改一改//但是我还是T了好几发,因为初始化数组的时候maxn开大了。。QAQ。改小了就过了。

代码:

 #include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = ; vector< pair<int,int> > e[maxn]; int n,m,X;
int d[maxn],inq[maxn]; int spfa(int s,int t){
for(int i = ;i < maxn ; i++)
inq[i] = ;
for(int i = ; i < maxn ; i++)
d[i] = 1e9;
queue<int>Q;
Q.push(s);d[s] = ;inq[s] = ;
while( !Q.empty() ){
int now = Q.front();
Q.pop();
inq[now] = ;
for(int i = ; i < e[now].size() ; i++){
int v = e[now][i].first;
if(d[v] > d[now] + e[now][i].second){
d[v] = d[now] + e[now][i].second;
if(inq[v] == )
continue;
inq[v] = ;
Q.push(v);
}
}
}
return d[t];
} int main() {
scanf("%d%d%d",&n,&m,&X);
int x,y,z;
for(int i = ; i < m ;i++){
scanf("%d%d%d",&x,&y,&z);
//cin>>x>>y>>z;
e[x].push_back(make_pair(y,z));
//e[y].push_back(make_pair(x,z));
} int ans = ;
for(int i = ;i <= n ;i++){
if(i == X){
continue;
}
int sum = spfa(X,i);
sum += spfa(i,X);
ans = max(ans,sum);
}
cout<<ans<<endl; return ;
}

最新文章

  1. 【代码笔记】iOS-自定义弹出框
  2. 161223、mysql锁的两个例子
  3. 获取数据库里面最新的ID
  4. ECshop设置301最快捷最简单的方法
  5. webapp开发之需要知道的css细节
  6. 「C语言」文件的概念与简单数据流的读写函数
  7. C#注册表操作,根据键取值
  8. 1-Highcharts 3D图之普通3D柱状图与带空值
  9. ThinkPHP 关联模型(二十)
  10. Linux程序设计综合训练之简易Web服务器
  11. K-means 算法
  12. Sharding-JDBC
  13. vue 项目中添加阿里巴巴矢量图
  14. python自动化系列
  15. Vim+Ctags+Cscope安装
  16. ie8,9不支持indexOf解决办法,纯拷贝
  17. 了解java虚拟机—串行回收器(6)
  18. SQL集合运算
  19. Prism 4 文档 ---第5章 实现MVVM模式
  20. RT-Thread Nano移植

热门文章

  1. 一:unittest框架配合selenium工具之CSS_selector定位。
  2. 关于“Unknown or unsupported command &#39;install&#39;”问题解决的小结
  3. chromedriver安装(谷歌浏览器驱动安装)
  4. MAC OpenGL 环境搭建
  5. Java学习之集合(List接口)
  6. 高级Java必看的10本书
  7. ES6数组Api扩充
  8. .Net平台调用の初识
  9. 2018-2-13-win10-uwp-如何拖动一个TextBlock的文字到另一个TextBlock-
  10. python 生成推导式