Silver cow party 迪杰斯特拉+反向

题意

有n个农场,编号1到n,每个农场都有一头牛。他们想要举行一个party,其他牛到要一个定好的农场中去。每个农场之间有路相连,但是这个路是单向的,并且去了还得回来,求花费时间最多是多少?

解题思路

很容易想明白需要分两步

  • 第一步:算出目的点到其他点的最短距离, 这一步很好实现,直接使用Dijkstra即可
  • 第二部:算出其他点到终点的最短距离。

关键就在第二部。迪杰斯特拉算的是某一点到其他所有点的最短距离,而这次我们是求的其他点到某一点的最短距离,正好反过来,这个该怎么求呢?反转矩阵。我们使用邻接矩阵的形式来存储图,在第一步已经求出来的情况下,把每条路反过来,就是把\(mp[i][j]\)和\(mp[j][i]\)的值互换,然后再求这个点到其他点的最短距离,所求的dis数组就是其他点到这一点的最短距离,想一想为什么,这个不太好说明白,咱们把问题简化一下,如果是双向图,那么使用Dijkstra求的是某一点到其他点的最短距离,那是不是也把其他点到这一点的最短距离也给求出来了,想到这,就比较好理解为什么要反转了吧。

代码实现

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e3+7;
int e[maxn][maxn];
int vis[maxn];
int dis[maxn];
int dis2[maxn];//把第一次存储的最短距离放到这里
int n, m, x;
void init()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
e[i][j]= i==j? 0:inf;
}
}
}
void dij(int s)
{
for(int i=1; i<=n; i++)
{
vis[i]=0;
dis[i]=e[s][i];
}
vis[s]=1;
for(int i=1; i<n; i++)
{
int tmp=inf, k;
for(int j=1; j<=n; j++)
{
if(!vis[j] && dis[j] < tmp)
{
tmp=dis[j];
k=j;
}
}
vis[k]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j] && dis[j] > dis[k]+e[k][j])
{
dis[j]=dis[k]+e[k][j];
}
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &x);
{
int a, b, c;
init();
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &a, &b, &c);
if(e[a][b]>c)
e[a][b]=c;
}
dij(x);
for(int i=1; i<=n; i++)
dis2[i]=dis[i];//备份
for(int i=2; i<=n; i++)//反转矩阵
for(int j=1; j<i; j++)//注意j要小于i
{
int tmp=e[i][j];
e[i][j]=e[j][i];
e[j][i]=tmp;
}
dij(x);
int ans=0;
for(int i=1; i<=n; i++)
{
if(ans < dis2[i]+dis[i])//求来回之和最大的那个
{
ans=dis2[i]+dis[i];
}
}
printf("%d\n", ans);
}
return 0;
}

END

Poj 3268 Silver cow party 迪杰斯特拉+反向矩阵的更多相关文章

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

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

  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. POJ 3268 Silver Cow Party (Dijkstra)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13982   Accepted: 6307 ...

  4. POJ 3268 Silver Cow Party (双向dijkstra)

    题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

  5. POJ 3268 Silver Cow Party 最短路

    原题链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

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

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

  7. 图论 ---- spfa + 链式向前星 ---- poj 3268 : Silver Cow Party

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12674   Accepted: 5651 ...

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

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

  9. poj 3268 Silver Cow Party

                                                                                                       S ...

随机推荐

  1. man cal

    CAL(1)                                                                  CAL(1) NAME       cal - 显示一个 ...

  2. 【leetcode】1156. Swap For Longest Repeated Character Substring

    题目如下: Given a string text, we are allowed to swap two of the characters in the string. Find the leng ...

  3. linux运维、架构之路-HAProxy反向代理

    一.HAProxy介绍          专业反向代理,支持双机热备支持虚拟主机,配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端节点出现故障, HAProxy会自动将该服务器摘除,故障恢复 ...

  4. Flink Batch SQL 1.10 实践

    Flink作为流批统一的计算框架,在1.10中完成了大量batch相关的增强与改进.1.10可以说是第一个成熟的生产可用的Flink Batch SQL版本,它一扫之前Dataset的羸弱,从功能和性 ...

  5. MIF文件生成说明

    mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.生成QuartusII11.0可用的mif文件,有如下几种方式: 方法1:利用Q ...

  6. JSP上传整个文件夹

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  7. Golang在京东列表页实践总结

    Golang在京东列表页实践总结 作者:张洪涛 10余年软件开发和设计经验,曾就职于搜狐.搜狗.前matrixjoy公司联合创始人.甘普科技CTO. 目前线上状态 基于搜索实现: 全量数据,搜索结果不 ...

  8. 洛谷P1309 瑞士轮——题解

    题目传送 思路非常简单,只要开始时把结构体排个序,每次给赢的加分再排序,共r次,最后再输出分数第q大的就行了. (天真的我估错时间复杂度用每次用sort暴力排序结果60分...)实际上这道题估算时间复 ...

  9. Java 静态初始化块等的执行顺序

    实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...

  10. UITabbarController & UITabbar 学习

    最后更新2016-04-06 一. UITabbarController 给UITabbarController 设置viewControllers熟悉时候,超过五个就会有一个 moreNavigat ...