***题意:在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. 吉特日化MES & RabbitMQ 的基本配置

    在吉特日化MES(日化配料系统)中涉及到大量的消息推送,其中针对设备数据的交互(读写) 大量使用了RabbitMQ来进行消息通讯以及程序上的解耦,其中包含使用PDA扫码登录到PLC控制程序,下发生产工 ...

  2. zookeeper JavaApi 删除节点

    /* * 删除节点 * 1.删除单个节点 * 2.删除带有子节点的节点 * 3.必须成功的删除 * 4.回调 * * */ @Test public void delete1() throws Exc ...

  3. [python]数据分析--数据清洗处理case1

    数据预处理案例1 主要涉及pandas读取csv文件,缺失值和重复值处理,分组计数,字段类型转换 ,结果写入到Excel. 根据要求对CSV数据集进行处理要求如下: 保留数据关键信息:time.lat ...

  4. 华企盾DSC客户端图标不显示常见处理方法

    1.检查是否启用了360桌面.猎豹桌面之类的(兼容腾讯桌面),打强制显示客户端图标的补丁 2.是否被杀毒软件查杀 3.用Autoruns查看explorer项图标那一栏前10个是否有我们图标没有的话把 ...

  5. flutter中去除导航栏与状态栏

    方法一 SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]); // ...

  6. CUDA C编程权威指南:1-基于CUDA的异构并行计算

      什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来 ...

  7. 揭秘华为云GaussDB(for Redis)丨大key治理

    本文分享自华为云社区<华为云GaussDB(for Redis)揭秘第31期:大key治理>,作者: 高斯Redis官方博客. 从DBA的视角看,大Key无疑是引起Redis线上问题的常见 ...

  8. 探秘华为云盘古大模型:AI for industries的身体力行

    摘要:大模型是新一轮AI发展的核心,其已在推进产业智能化升级中已表现出巨大潜力,并将在未来三年里形成风起云涌之势. 本文分享自华为云社区<探秘华为云盘古大模型:AI for industries ...

  9. 华为云企业级Redis:助力VMALL打造先进特征平台

    摘要:当电商平台对AI算法模型的需求越来越多,特征数据平台的统一建设是不少开发团队头疼的事情.因为只有通过统一的特征数据存储,才能改变原有的"数据孤岛",解决生产重复造轮子的窘境. ...

  10. storybook插件说明: integrations与addons推荐

    官方的: https://storybook.js.org/integrations/ https://github.com/storybookjs/storybook/blob/master/ADD ...