本题思路:对原图和原图的逆图分别用一次最短路,找出最大值即可。

一开始是我是对每个顶点spfa搜了一波,结果判题时间巨长,还好这个题的数据量不是很大,所以就用了另一种思路。

  参考代码:spfa单结点爆搜版

 #include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std; const int maxn = + , INF = 0x3f3f3f3f;
struct edge {
int to, cost;
};
int n, m, x, ans, dist[maxn];
vector<edge> G[maxn];
bool vis[maxn]; void addedge(int u, int v, int w) {
G[u].push_back({v, w});
} int spfa(int source, int aid) {
memset(vis, false, sizeof vis);
for(int i = ; i <= n; i ++)
dist[i] = (i == source ? : INF);
queue <int> Q;
Q.push(source);
vis[source] = true;
while(!Q.empty()) {
int now = Q.front();
Q.pop();
for(int i = ; i < G[now].size(); i ++) {
edge e = G[now][i];
if(dist[e.to] > dist[now] + e.cost) {
dist[e.to] = dist[now] + e.cost;
if(!vis[e.to]) Q.push(e.to);
}
}
}
return dist[aid];
} int main () {
ans = ;
int u, v, w;
cin >> n >> m >> x;
for(int i = ; i <= m; i ++) {
cin >> u >> v >> w;
addedge(u, v, w);
}
for(int i = ; i <= n; i ++)
ans = max(spfa(i, x) + spfa(x, i), ans);
cout << ans << endl;
return ;
}

  对原图和逆图分别进行一次Dijkstra的终极版本

 #include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std; const int maxn = + , INF = 0x3f3f3f3f;
struct edge {
int to, cost;
};
int n, m, x, k, ans, dist1[maxn], dist2[maxn], G[maxn][maxn];;
bool vis[maxn]; void Dijkstra(int lowcost[]) {
for(int i = ; i <= n; i ++)
lowcost[i] = INF;
lowcost[x] = ;
memset(vis, false, sizeof vis);
for(int i = ; i <= n; i ++) {
int minf = INF;
for(int j = ; j <= n; j ++)
if(minf > lowcost[j] && !vis[j]) {
k = j;
minf = lowcost[j];
}
vis[k] = true;
for(int j = ; j <= n; j ++)
if(!vis[j] && lowcost[j] > lowcost[k] + G[k][j])
lowcost[j] = lowcost[k] + G[k][j];
}
} int main () {
ans = ;
int u, v, w;
cin >> n >> m >> x;
for(int i = ; i <= n; i ++)
for(int j = ; j <= n; j ++)
if(i == j) G[i][j] = ;
else G[i][j] = INF;
for(int i = ; i <= m; i ++) {
cin >> u >> v >> w;
G[u][v] = min(G[u][v], w);
}
Dijkstra(dist1);
for(int i = ; i <= n; i ++)
for(int j = ; j < i; j ++)
if(G[i][j]) swap(G[i][j], G[j][i]);
Dijkstra(dist2);
for(int i = ; i <= n; i ++)
ans = max(ans, dist1[i] + dist2[i]);
cout << ans << endl;
return ;
}

POJ-3268.SilverCowParty.(最短路 + 图的转置)的更多相关文章

  1. POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】

    Silver Cow Party Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Su ...

  2. POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。

    POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...

  3. DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards

    题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...

  4. POJ 3268 Silver Cow Party (最短路径)

    POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...

  5. POJ 1161 Walls(最短路+枚举)

    POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...

  6. [NOIP2017]逛公园 最短路图 拓扑序DP

    ---题面--- 题解: 挺好的一道题. 首先我们将所有边反向,跑出n到每个点的最短路,然后f[i][j]表示从i号节点出发,路径长比最短路大j的方案数. 观察到,如果图中出现了0环,那么我们可以通过 ...

  7. 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)

    题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...

  8. [JZOJ5279]香港记者题解--最短路图

    [JZOJ5279]香港记者题解--最短路图 题目链接 过 于 暴 力 分析 有一个naiive的想法就是从1到n跑最短路,中途建图,然后在图上按字典序最小走一遍,然而·这是不行的,你这样跳不一定能跳 ...

  9. Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)

    题意:给出一张有向图,每条边有长度,对于每条边,你要回答将该边的方向取反后,从起点到终点的最短距离是增加or减小or不变. 首先求出起点到所有点的最短距离和所有点到终点的最短距离(两次DIjkstra ...

随机推荐

  1. Linux 系统下使用dd命令备份还原MBR主引导记录

    https://en.wikipedia.org/wiki/Master_boot_recordhttps://www.cyberciti.biz/faq/howto-copy-mbr/https:/ ...

  2. 《DSP using MATLAB》Problem 7.9

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  3. zombodb 聚合函数

    zombodb 暴露基本上所有es 的集合函数为sql 函数,我们可以方便使用 比如 count FUNCTION zdb.count( index regclass, query zdbquery) ...

  4. oracle-data-mining

    create user datamine identified by 123456 QUOTA UNLIMITED ON users; 然后在sqldeveloper工具界面-data miner中, ...

  5. 2、php中字符串单引号好和双引号的区别

    使用单引号和双引号的主要区别是:单引号定义的字符串中出现的变量和转义序列不会被变量的值代替,而双引号中使用变量名会显示该变量的值.

  6. DevExpress破解和消除弹出框问题

    在解决方案管理器列表中找到 license.licx 设置属性 将[生成操作]选项改为[无]

  7. js基础系列之【原型和原型链】

    声明:形成本文的出发点仅仅是个人总结记录,避免遗忘,并非详实的教程:文中引用了经过个人加工的其它作者的内容,并非原创.学海无涯 引入问题 一般我们是这样写的: (需求驱动技术,疑问驱动进步) // 构 ...

  8. windows shell命令相关

    一 系统自带的命令 1 创建文件夹 mkdir 文件夹名 2 强制删除文件夹 rd/s/q 文件夹名 3 强制删除文件 del/f/s/q 文件名 4 移动文件到文件夹 move 文件名 文件夹名 二 ...

  9. 笔记本 原来win10系统改装win7系统遇到 invaid signature detected.check secure boot policy setup问题

    这次操作的笔记本电脑是   华硕R414U 大家如果遇到类似问题的话也可以参考这个方法,但是必须搞清楚电脑的型号,型号不同操作起来有差别的 我这里选择的重装系统的方法是最简单粗暴的硬盘安装方法,怎么硬 ...

  10. Vue非父子组件之间的传值

    1.新建一个js文件  然后引入vue 实例化vue 最后暴露这个实例:实例化Vue对象的时候名称要小写,大写控制台报错,我也不知道什么原因: 2.在要广播的地方引入刚才定义的实例: 3通过VueEm ...