题意:

n个地方,标号1~n,每个地方都有一头牛,现在要他们都去往标号为x的地方,再从x返回,每条道路都是单向的,求所有牛走的来回的最短路中的最大值。

分析:

注意在求每头牛走到x时,挨个算肯定超时,可以在将道路反向处理,都变成从x出。之前用vector模拟邻接表超时,后来用链表和数组分别模拟了邻接表,好像数组模拟的更快一些。

代码:

链表:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn =1005, maxm = 100005, INF = 0x3fffffff;
struct edge
{
int to, w;
edge* next;
};
int n, m, x;
int in[maxn], d[maxn], d1[maxn];
edge* head[maxn];
edge* head2[maxn];
queue<int>q;
void spfa()
{
fill(d, d+1+n,INF);
fill(in, in + 1 + n, 0);
d[x] = 0;
q.push(x);
in[x] = 1;
while(!q.empty()){
int a = q.front();
edge* t =head[a];q.pop();
in[a] = 0;
while(t!=NULL){
if(d[t->to]>d[a]+t->w){
d[t->to] = d[a] + t->w;
if(!in[t->to]){q.push(t->to);in[t->to] = 1;}
}
t = t->next;
}
}
return;
}
void spfa2()
{
fill(d1, d1+1+n,INF);
fill(in, in + 1 + n, 0);
d1[x] = 0;
q.push(x);
in[x] = 1;
while(!q.empty()){
int a = q.front();
edge* t=head2[a];q.pop();
in[a] = 0;
while(t!=NULL){
if(d1[t->to]>d1[a]+t->w){
d1[t->to] = d1[a] + t->w;
if(!in[t->to]){q.push(t->to);in[t->to] = 1;}
}
t = t->next;
}
}
return;
}
int main (void)
{
scanf("%d%d%d",&n,&m,&x);
int t1, t2, t3;
int res = 0;
memset(head, 0,sizeof(head));
for(int i = 0; i <m; i++){
scanf("%d%d%d", &t1, &t2, &t3);
edge* temp=new edge;
edge* temp2 = new edge;
temp->to = t2;
temp->w= t3;
temp->next = NULL;
if(head[t1]==NULL) head[t1] = temp;
else {
temp->next =head[t1];
head[t1] = temp;
}
temp2->to = t1;
temp2->w = t3;
temp2->next = NULL;
if(head2[t2]==NULL) head2[t2] = temp2;
else {
temp2->next = head2[t2];
head2[t2] = temp2;
}
}
spfa();
spfa2(); for(int i = 1; i <= n; i++){ if(i!=x&&res<d[i]+d1[i]) res = d[i]+d1[i];
}
printf("%d\n",res);
}

数组:

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int n, m, x;
struct edge{
int to,w;
int next;
};
const int maxn =1005, maxm = 100005, INF = 0x3fffffff;
int head[maxn], head2[maxn];
edge e[maxm], re[maxm];
int in[maxn], d[maxn], d1[maxn];
void spfa()
{
fill(d, d+n+1,INF);
fill(in, in+n+1,0);
queue<int>q;
q.push(x);
in[x] = 1;
d[x] = 0;
while(!q.empty()){
int tmp = q.front();q.pop();
in[tmp] = 0;
int t = head[tmp];
while(t!=-1){
if(d[e[t].to] > d[tmp] + e[t].w){
d[e[t].to] = d[tmp] + e[t].w;
if(!in[e[t].to]){
q.push(e[t].to);
in[e[t].to] = 1;
}
}
t = e[t].next;
}
}
}
void spfa2()
{
fill(d1,d1+n+1,INF);
fill(in, in+n+1,0);
queue<int>q;
q.push(x);
in[x] = 1;
d1[x] = 0;
while(!q.empty()){
int tmp = q.front();q.pop();
in[tmp] = 0;
int t = head2[tmp];
while(t!=-1){
if(d1[re[t].to] > d1[tmp]+re[t].w){
d1[re[t].to] = d1[tmp] + re[t].w;
if(!in[re[t].to]){
q.push(re[t].to);
in[re[t].to] = 1;
}
}
t = re[t].next;
}
}
}
int main (void)
{
scanf("%d%d%d",&n,&m,&x);
int a, b ,c;
fill(head, head+n+1, -1);
fill(head2, head2+n+1, -1);
for(int i = 0; i < m; i++){
scanf("%d%d%d",&a,&b,&c);
e[i].to = b, e[i].w = c;
e[i].next = head[a];
head[a] = i;
re[i].to = a, re[i].w =c;
re[i].next = head2[b];
head2[b] = i;
}
spfa();
spfa2();
int res = 0; for(int i = 1; i <= n ; i++){
if(i!=x&&res<d[i]+d1[i]) res = d[i]+d1[i];
}
printf("%d\n",res); }

POJ 3268_Silver Cow Party的更多相关文章

  1. POJ 3045 Cow Acrobats (贪心)

    POJ 3045 Cow Acrobats 这是个贪心的题目,和网上的很多题解略有不同,我的贪心是从最下层开始,每次找到能使该层的牛的风险最小的方案, 记录风险值,上移一层,继续贪心. 最后从遍历每一 ...

  2. poj 3348 Cow 凸包面积

    Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8122   Accepted: 3674 Description ...

  3. POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包)

    POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包) Description N (1 ≤ N ...

  4. POJ 3176 Cow Bowling(dp)

    POJ 3176 Cow Bowling 题目简化即为从一个三角形数列的顶端沿对角线走到底端,所取得的和最大值 7 * 3 8 * 8 1 0 * 2 7 4 4 * 4 5 2 6 5 该走法即为最 ...

  5. POJ 2184 Cow Exhibition【01背包+负数(经典)】

    POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...

  6. POJ 2375 Cow Ski Area(强连通)

    POJ 2375 Cow Ski Area id=2375" target="_blank" style="">题目链接 题意:给定一个滑雪场, ...

  7. Poj 3613 Cow Relays (图论)

    Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...

  8. POJ 3660 Cow Contest

    题目链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  9. poj 1985 Cow Marathon

    题目连接 http://poj.org/problem?id=1985 Cow Marathon Description After hearing about the epidemic of obe ...

随机推荐

  1. Oracle中的表空间

    表空间是什么? Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构是指构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念及它们之间的关系. 表空间是数据库数据 ...

  2. C#过时方法标记

    1.当遇到过时或废弃的方式 函数怎么办 [Obsolete]特性解决你的困惑 1.1:当方法已经完成相关兼容 可以保留时

  3. pandas之groupby分组与pivot_table透视表

    zhuanzi: https://blog.csdn.net/qq_33689414/article/details/78973267 pandas之groupby分组与pivot_table透视表 ...

  4. 一致性hash学习

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  5. H3C AR28-31路由器组网实验

    接线图 可以发现PC1和PC2不在一个网段上,如果不靠路由器就不可能ping,所以要用路由器组网 接线步骤 串行线连接路由器1与路由器2 以太网线连路由器以太网口 与 交换机接口 计算机网线连交换机口 ...

  6. Codeforces_789C_(dp)

    C. Functions again time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. MFC_VS清理器

    VS清理器 界面 工程目录 列表控件ID改名IDC_FILELIST 绑定变量m_FileList 属性设置Accept Files 设置True 成员添加 // 用于保存待遍历的目录 vector& ...

  8. blockdev - 从命令行调用区块设备控制程序

    总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...

  9. vue工程化之去除Eslint验证

    有的时候用vue-cli创建好项目之后,写代码时会出现换行和空格报错,出现这么写错误是什么原因呢? 相信第一次接触时有点摸不着头脑.其实是在你用vue-cli脚手架构建项目时用了ESLint代码检查工 ...

  10. java引用数据类型在方法中的值传递

    package org.jimmy.autosearch20180821.test; public class TestStringArr { public static void main(Stri ...