Poj 3268 Silver cow party 迪杰斯特拉+反向矩阵
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 迪杰斯特拉+反向矩阵的更多相关文章
- POJ 3268 Silver Cow Party (最短路径)
POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...
- POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。
POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...
- POJ 3268 Silver Cow Party (Dijkstra)
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13982 Accepted: 6307 ...
- POJ 3268 Silver Cow Party (双向dijkstra)
题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total ...
- POJ 3268 Silver Cow Party 最短路
原题链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total ...
- POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】
Silver Cow Party Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Su ...
- 图论 ---- spfa + 链式向前星 ---- poj 3268 : Silver Cow Party
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12674 Accepted: 5651 ...
- DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards
题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...
- poj 3268 Silver Cow Party
S ...
随机推荐
- wepy-开发总结(功能点)
开发小程序中,遇到的wepy的几点坑,记录一下; 更详细的项目总结记录请见我的个人博客:https://fanghongliang.github.io/ 1.定时器: 在页面中有需要用到倒计时或者其他 ...
- TodoList案例
我们今天模仿ToDoList进行一个简单的增,删,改,查的操作 可参考官网 http://www.todolist.cn/ 下边直接上代码 import React from 'react'; cl ...
- 【LuoguP4770】[NOI2018] 你的名字
题目链接 题意简述 给定一个串 \(S\) 多组询问 , 每次给定一个串 \(T\) 和一个 区间 \([l,r]\) 求串\(T\) 有多少个本质不同的子串 满足不是 \(S[l...r]\) 的子 ...
- 【leetcode】K-th Symbol in Grammar
题目如下: 解题思路:直接把每行的数据计算出来肯定是不行的,因为N最大是30,那个第N行长度就是2^30次方,这显然不可取.那么就只能找规律了,我采取的是倒推法.例如假如我们要求出第四行第七个元素的值 ...
- 多模字符串匹配算法-Aho–Corasick
背景 在做实际工作中,最简单也最常用的一种自然语言处理方法就是关键词匹配,例如我们要对n条文本进行过滤,那本身是一个过滤词表的,通常进行过滤的代码如下 for (String document : d ...
- vue 父子组件渲染
问题描述:父组件调用了一个子组件,传递了一个id的属性到子组件, 但是在子组件中将这个id的props属性赋值给了data里面定义的另外一个属性myId,并且写了watch监听这个id的props. ...
- JavaScript正则表达式(四)
正则表达式方法 一.test方法 用于测试字符串参数中是否存在匹配正则表达式模式的字符串 如果存在就返回true,否则返回false 实例: 1.使用test方法不设置g标志时 2.使用test方法 ...
- luogu【P1024 一元三次方程求解】题解
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- 微信小程序自定义底部导航栏组件+跳转
微信小程序本来封装有底部导航栏,但对于想自定义样式和方法的开发者来说,这并不是很好. 参考链接:https://github.com/ljybill/miniprogram-utils/tree/ma ...
- [思路题][LOJ2290][THUWC2017]随机二分图:状压DP+期望DP
分析 考虑状压DP,令\(f[sta]\)表示已匹配状态是\(sta\)(\(0\)代表已匹配)时完美匹配的期望数量,显然\(f[0]=1\). 一条边出现了不代表它一定在完美匹配内,这也导致很难去直 ...