poj 3268 最短路
***题意:在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 最短路的更多相关文章
- poj 3268 最短路dijkstra *
题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最 ...
- POJ 3268 最短路应用
POJ3268 题意很简单 正向图跑一遍SPFA 反向图再跑一边SPFA 找最大值即可. #include<iostream> #include<cstdio> #includ ...
- POJ 3268——Silver Cow Party——————【最短路、Dijkstra、反向建图】
Silver Cow Party Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Su ...
- POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。
POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbe ...
- DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards
题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...
- POJ 3268 Silver Cow Party (最短路径)
POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...
- Heavy Transportation POJ 1797 最短路变形
Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你 ...
- 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 (求给定两点之间的最短路)
http://poj.org/problem?id=3268 每头牛都要去标号为X的农场参加一个party,农场总共有N个(标号为1-n),总共有M单向路联通,每头牛参加完party之后需要返回自己的 ...
- poj 3268 Silver Cow Party(最短路,正反两次,这个模版好)
题目 Dijkstra,正反两次最短路,求两次和最大的. #define _CRT_SECURE_NO_WARNINGS //这是找出最短路加最短路中最长的来回程 //也就是正反两次最短路相加找最大的 ...
随机推荐
- 一招MAX降低10倍,现在它是我的了
一.背景 性能优化是一场永无止境的旅程. 到家门店系统,作为到家核心基础服务之一,门店C端接口有着调用量高,性能要求高的特点. C端服务经过演进,核心接口先查询本地缓存,如果本地缓存没有命中,再查询R ...
- 打造一个极度舒适的Chrome扩展项目开发环境
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. Chrome 扩展能够提高浏览器的使用体验,通过自定义 UI 界面,监听浏览器事件,改变 Web 页 ...
- 华企盾DSC为平面设计公司提供数据防泄漏解决方案
华企盾DSC作为一款专业的数据防泄漏解决方案,为平面设计公司提供多方位而有效的安全保障.以下是该解决方案为平面设计公司所带来的主要优势: 图纸加密保护: 超安全的加密技术确保设计公司的图纸和敏感信息得 ...
- pytest框架学习-标签@pytest.mark.
标签 自定义标签(区分大小写) 可以标记测试用例,对测试用例进行分组,有利于对测试用例进行筛选. 比如:给用例打标为API,代表接口自动化的用例,打标方法为@pytest.mark.API,打标后,需 ...
- springboot整合hibernate(非JPA)(一)
springboot整合hibernate(非JPA)(一) springboot整合hibernate,非jpa,若是jpa就简单了,但是公司项目只有hibernate,并要求支持多数据库,因此记录 ...
- electron入门之通知Notification(二)
electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...
- Android 蓝牙使用
原文地址: Android 蓝牙使用 - Stars-One的杂货小窝 公司项目需求需要实现监听蓝牙耳机连接,且要获取蓝牙耳机电量功能,翻了不少官方文档,记录下技术调研代码 注:本文没有研究蓝牙配对功 ...
- APM市场冰火两重天,或许只是行业无处安放的焦虑
近两年来,无论从国内还是到国外,市场出现一种APM批判的论调,甚至有"传统APM已经落后"的个别声音出现. 可放眼望去,国外主流APM厂商如:DATADOG. Dynatrace. ...
- 文心一言 VS 讯飞星火 VS chatgpt (176)-- 算法导论13.3 5题
五.用go语言,考虑一棵用 RB-INSERT 插人 n 个结点而成的红黑树.证明:如果 n>1,则该树至少有一个红结点. 文心一言: 要证明这个问题,我们首先需要理解红黑树的性质.红黑树是一种 ...
- 宝塔面板如何用一IP不同端口创建不同的网站(“您添加的站点已存在”)
问题描述 玩宝塔面板的时候,一开始没有云服务器,需要在本地虚拟机里搭建各种网站,想在本地服务器下搭建多个站点,但是总会遇到"您添加的站点已存在"这个现象. 问题原因及解决办法 出现 ...