题意:

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. PHP PDO事务处理及MYSQLengine=InnoDB

    如果出现“#skip-innodb”则将“#”去掉,重启MySQL: 如果第一条无法解决,加上配置:default-storage-engine=InnoDB 再重启MySQL. 进入MYsql数据据 ...

  2. AJPFX理解反射及反射的应用

    怎么理解反射,反射的应用        反射就是把Java类中的各种成分映射成相应的Java类.        一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方 ...

  3. 掌握Spark机器学习库-07-回归分析概述

    1)回归与分类算法的区别 回归的预测结果是连续的,分类的预测结果是离散的. 2)spark实现的回归算法有: 3)通过相关系数衡量线性关系的程度

  4. Python学习 Day 3 字符串 编码 list tuple 循环 dict set

    字符串和编码 字符 ASCII Unicode UTF-8 A 1000001 00000000 01000001 1000001 中 x 01001110 00101101 11100100 101 ...

  5. SCCM大致安装过程,参考前辈教程完成部署

    本安装sccm主站点服务器准备 参考:http://stephen1991.blog.51cto.com/8959108/1529864 1.  准备三台服务器 ,注:所有服务器需要安装 .net3. ...

  6. 2015年度精品 最新力作32位和64位xp,win7,win8,win10系统下载(电脑城专用版)

    一.系统主要特点 1.安装维护方便快速 - 全自动无人值守安装,采用万能GHOST技术,安装系统过程只需3-5分钟,适 合新旧各种机型. - 集成常见硬件驱动,智能识别+预解压技术,绝大多数硬件可以快 ...

  7. AIX 10G HA RAC卸载

    删除 1:crs_stat –t资源都停掉 2:停ha 3: 删除oracle 4:删除crs 5: 删除ha smit hacmp 6: 删除vg exportvg 7;卸载hacmp smitty

  8. 自定义对话框(jDialog)

    [配置项]jDialog options点击收起 一.接口功能 jDialog的默认配置项,本组件提供的所有对话框,都可以通过修改这些配置项来实现不同的效果. 二.详细配置项 /** * 对话框的默认 ...

  9. STL中unique的使用

    作用 unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲) 定义在头文件<algorithm>中 函数原型 1.只有两个参数,且参数类型都是迭代器: iter ...

  10. 修改phpadmin中的默认超时时间

    登录后1440秒未活动后总是自动退出,一天还要登录多次,终于有时间来解决这个问题了,感觉是session超时,结果在网上search了下,找到解决办法啦,哈哈哈,在此做个笔记: phpmyadmin在 ...