***题意:在x这个点有个聚会,其他的点要到x这个点,然后再会自己原始的点,求一来一回最大的那个距离

做法:两边dijstra算法,因为是单向图,要注意更新顺序***

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm> using namespace std;
#define N 1010
#define INF 0x3f3f3f3f int maps[N][N];
int n, m, x;
int dist1[N], dist2[N], vis[N]; void Init()
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
maps[i][j]=i==j ? 0 : INF;
} void dij()
{
for(int i=1; i<=n; i++)
dist1[i]=maps[i][x]; memset(vis, 0, sizeof(vis));
vis[x]=1;
for(int i=1; i<=n; i++)
{
int Min=INF, index=-1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dist1[j]<Min)
{
Min=dist1[j];
index=j;
}
}
if(index==-1) break;
vis[index]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dist1[j]>maps[j][index]+dist1[index])
dist1[j]=maps[j][index]+dist1[index];
}
}
for(int i=1; i<=n; i++)
dist2[i]=maps[x][i]; memset(vis, 0, sizeof(vis));
vis[x]=1;
for(int i=1; i<=n; i++)
{
int Min=INF, index=-1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dist2[j]<Min)
{
Min=dist2[j];
index=j;
}
}
if(index==-1) break;
vis[index]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dist2[j]>dist2[index]+maps[index][j])
dist2[j]=dist2[index]+maps[index][j];
}
}
} int main()
{
while(~scanf("%d%d%d", &n, &m, &x))
{
Init();
int u, v, len;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &u, &v, &len);
maps[u][v]=min(len, maps[u][v]);
}
dij(); int ans=-1; for(int i=1; i<=n; i++)
{
if(dist1[i]+dist2[i]>ans)
ans=dist1[i]+dist2[i];
}
printf("%d\n", ans);
}
return 0;
}

***两遍spfa,第二次的spfa要使用开始建的反向图,建的反向图也就是以x为如点,dist1里存就是其他店到x的距离***

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm> using namespace std;
#define N 101000
#define INF 0x3f3f3f3f int n, m, x;
int dist[N], head[N], dist1[N], head1[N], vis[N], k, k1; struct node
{
int v, len, next;
} a[N], b[N]; void add(int u, int v, int len)
{
a[k].v=v;
a[k].len=len;
a[k].next=head[u];
head[u]=k++;
} void add1(int u, int v, int len)
{
b[k1].v=v;
b[k1].len=len;
b[k1].next=head1[u];
head1[u]=k1++;
} int spfa()
{
queue<int> q;
q.push(x);
dist[x]=0;
vis[x]=1; while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=0;
for(int i=head[t]; i!=-1; i=a[i].next)
{
int v=a[i].v;
if(dist[v]>dist[t]+a[i].len)
{
dist[v]=dist[t]+a[i].len;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
memset(vis, 0, sizeof(vis));
queue<int> Q;
Q.push(x);
dist1[x]=0;
vis[x]=1; while(!Q.empty())
{
int t=Q.front();
Q.pop();
vis[t]=0;
for(int i=head1[t]; i!=-1; i=b[i].next)
{
int v=b[i].v;
if(dist1[v]>dist1[t]+b[i].len)
{
dist1[v]=dist1[t]+b[i].len;
if(!vis[v])
{
vis[v]=1;
Q.push(v);
}
}
}
}
int ans=-1;
for(int i=1; i<=n; i++)
{
if(ans<dist[i]+dist1[i]&&dist[i]!=INF&&dist1[i]!=INF)
ans=dist[i]+dist1[i];
}
return ans;
} int main()
{
int u, v, len;
while(~scanf("%d%d%d", &n, &m, &x))
{
memset(dist, INF, sizeof(dist));
memset(dist1, INF, sizeof(dist1));
memset(head, -1, sizeof(head));
memset(head1, -1, sizeof(head1));
memset(vis, 0, sizeof(vis));
k=k1=1;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &u, &v, &len);
add(u, v, len);
add1(v, u, len);
}
int ans=spfa(); printf("%d\n", ans);
}
return 0;
}

poj 3268 最短路的更多相关文章

  1. poj 3268 最短路dijkstra *

    题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最 ...

  2. POJ 3268 最短路应用

    POJ3268 题意很简单 正向图跑一遍SPFA 反向图再跑一边SPFA 找最大值即可. #include<iostream> #include<cstdio> #includ ...

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

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

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

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

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

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

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

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

  7. Heavy Transportation POJ 1797 最短路变形

    Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...

  8. POJ 3268 Silver Cow Party 最短路

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

  9. poj - 3268 Silver Cow Party (求给定两点之间的最短路)

    http://poj.org/problem?id=3268 每头牛都要去标号为X的农场参加一个party,农场总共有N个(标号为1-n),总共有M单向路联通,每头牛参加完party之后需要返回自己的 ...

  10. poj 3268 Silver Cow Party(最短路,正反两次,这个模版好)

    题目 Dijkstra,正反两次最短路,求两次和最大的. #define _CRT_SECURE_NO_WARNINGS //这是找出最短路加最短路中最长的来回程 //也就是正反两次最短路相加找最大的 ...

随机推荐

  1. [ABC262C] Min Max Pair

    Problem Statement You are given a sequence $a = (a_1, \dots, a_N)$ of length $N$ consisting of integ ...

  2. 小傅哥自研插件,为开发提效80%,已经有8.1k安装量!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 哈喽,大家好我是技术UP主小傅哥. 如果你担心维护成本和性能考量,不想使用 BeanUtils ...

  3. jenkins删除构建历史并重置构建序号

    系统管理 工具和动作-->脚本命令执行 删除之前,现在已经构建了156次  输入脚本 println(Jenkins.instance.getJobNames()) //查看获取任务名列表//要 ...

  4. minio集群部署

    minio集群部署 1.说明: 安装前需要再添加一个磁盘后将磁盘挂载到/opt/minio目录,minio集群部署需要独占磁盘分区,不能使用文件夹代替. 运行分布式 MinIO 实例的服务器时间差不应 ...

  5. 从零玩转Nginx-从零玩转nginx

    title: 从零玩转Nginx date: 2023-05-13 23:08:49.074 updated: 2023-05-13 23:17:26.474 url: https://www.yby ...

  6. VSCode 中优雅地编写 Markdown

    VSCode 中优雅地编写 Markdown 在 VSCode 中编写 Markdown 有几个无法拒绝的优势,首先是顺手方便,常写代码的同学打开 VSCode 各项功能和快捷键使用的都比较熟练,可以 ...

  7. Python汉诺塔递归算法实现

    关于用递归实现的原理,请查看我之前的文章: C语言与汉诺塔 C#与汉诺塔 以下为代码: count = 0 def move(pile, src, tmp, dst): global count if ...

  8. android ProgressBar样式

    实现进度条由浅黄(#ffff33)到深黄色(#ff6600)的渐变样式. 与进度条自动从0加载到99,进度条每次加1 android:max:进度条的最大值. android:progressDraw ...

  9. [极客大挑战 2019]Havefun 1

    [极客大挑战 2019]Havefun 1 一,审题,观察题目信息和知识点 观察题目,没发现有效信息 ​ F12打开源代码,发现有一个GET传输. ​ 知识点 GET方法的数据传输是通过URL传输的, ...

  10. 如何延长window11更新信息?

    前言 日常使用电脑的时候,我们总是会遇到一个很常见的问题:如何关闭windows自动更新. 解决方法一: 暂停更新 解决方法二: 打开注册表: 运行 => regedit 进入: HKEY_LO ...