POJ 3268 Silver Cow Party (最短路)

原创 2018年04月16日 17:45:01

【题目链接】
http://poj.org/problem?id=3268

题目意思

有n只牛,编号从1到n,现在k号家开party,所以牛都会去,当这些牛非常懒,他们想尽可能走短的路(去时加回来),现在路是有向路,问路程最远的一只牛的路程

解题思路

每只牛的路程都可以分成去时和回时。可以用spfa或迪杰斯特拉单源点循环跑,找最大的。弗洛伊德会超时。上面这虽然会过但是耗时大,只要把有向边反过来建立反向图这样跑两遍就够了(看了大神vector用法真的6)。

代码部分


#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
//#define inf 0x3f3f3f3
const int N = 1005;
const int inf = 999999;
int dis[N];   ///存储最短路 
int vis[N];  ///记录是否在队列 
int t,k,n;
struct node
{
    int v,w;
}s;
vector<node>m[N];
void spfa(int s)
{
    memset(vis,0,sizeof(vis));
    memset(dis,inf,sizeof(dis)); 
    queue<int>q;
    q.push(s);
    vis[s] = 1;
    dis[s] = 0;
    while (!q.empty())
    {
        int t = q.front();
        q.pop();
        for (int i = 0; i < m[t].size();i++)
        {
            if (dis[m[t][i].v] > dis[t]+m[t][i].w)  ///松弛 
            {
                dis[m[t][i].v] = dis[t]+m[t][i].w;
                if (!vis[m[t][i].v])   ///判断是否在队列 
                {
                    q.push(m[t][i].v);
                    vis[m[t][i].v] = 1;
                }
            }
        }
        vis[t] = 0;
    }
}
int main()
{
    int Max = -1;
    scanf("%d %d %d",&n,&t,&k);
    for(int i =0; i < t;i++)
    {
        int v,u,w;
        scanf("%d %d %d",&u,&v,&w);
        s.v = v;
        s.w = w;
        m[u].push_back(s);
    }
    for (int i = 1; i <= n; i++)
    {
        int s=0;
        spfa(i);
        s += dis[k];
        spfa(k);
        s += dis[i];
        if (Max < s)
            Max = s;
    }
    printf("%d\n",Max);
    return 0;
} 

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
//#define inf 0x3f3f3f3
const int N = 1005;
const int inf = 999999;
int dis[N];   ///存储正向最短路 
int fdis[N];  ///存储反向最短路 
int vis[N];  ///记录是否在队列 
int t,k,n;
struct node
{
    int v,w;
}s;
vector<vector<node> >m(N); ///正向图 
vector<vector<node> >fm(N);  ///反向图 
void spfa(int s)
{
    memset(vis,0,sizeof(vis));
    memset(dis,inf,sizeof(dis)); 
    queue<int>q;
    q.push(s);
    vis[s] = 1;
    dis[s] = 0;
    while (!q.empty())
    {
        int t = q.front();
        q.pop();
        for (int i = 0; i < m[t].size();i++)
        {
            if (dis[m[t][i].v] > dis[t]+m[t][i].w)  ///松弛 
            {
                dis[m[t][i].v] = dis[t]+m[t][i].w;
                if (!vis[m[t][i].v])   ///判断是否在队列 
                {
                    q.push(m[t][i].v);
                    vis[m[t][i].v] = 1;
                }
            }
        }
        vis[t] = 0;
    }
}
int main()
{
    int Max = -1;
    scanf("%d %d %d",&n,&t,&k);
    for(int i =0; i < t;i++)
    {
        int v,u,w;
        scanf("%d %d %d",&u,&v,&w);
        s.v = v;
        s.w = w;
        m[u].push_back(s);
        s.v = u;
        fm[v].push_back(s);
    }
    spfa(k);
    memcpy(fdis,dis,sizeof(dis)); 
    m = fm;
    spfa(k);
    for (int i = 1; i <= n; i++)
    {
        Max = max(Max,dis[i]+fdis[i]);
    }
    printf("%d\n",Max);
    return 0;
} 
版权声明:本文为博主原创文章,转载请附带博主链接。 https://blog.csdn.net/pashuihou/article/details/79963863

用人新观念--允许最好的人才失败

用人新观念--允许最好的人才失败    1988年在硅谷成立的趋势科技只是一个不到10名员工的防毒软件小公司, 短短数年间,趋势科技跻身全球第二大企业、亚洲最大的防毒软件公司,。趋势科技公司成功的秘诀...
  • ghj1976
  • ghj1976
  • 2001-04-17 10:49:00
  • 1249

poj3268 - Silver Cow Party

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...
  • wangjian8006
  • wangjian8006
  • 2012-08-16 10:20:10
  • 3298

POJ 3268 Silver Cow Party(找最短路径的最大值+两次Dijkstra算法)

这道题是今下午练习赛的题目,感觉题目很好。       题意大致是,每头牛要从起点去终点,再从终点回到起点,并且从起点到终点和从终点到起点为单向路径,求所有牛里面 起点到终点+终点到起点 的最短路径...
  • qq_35739903
  • qq_35739903
  • 2017-08-22 20:00:16
  • 122

POJ 3268 Silver Cow Party (Dijkstra~)

N只母牛(起始地点不同)要去X这个地方,给出有向图,要求求出他们到x后并且返回(不一定原路,有向图)的路程最大的母牛(算的是来回), 其中他们走到x和从x返回走的路径均是最短的。 思路: 从x到每个...
  • murmured
  • murmured
  • 2013-12-19 16:51:56
  • 1234

POJ3268 Silver Cow Party(最短路问题)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21730 ...
  • qq_34826781
  • qq_34826781
  • 2017-05-03 22:02:22
  • 91

POJ3268 Silver Cow Party spfa求解 最短路

题意:有N个点M条边,农场间由M条有向路径连接。每头牛来回都走最短的路,求这些牛中来回的最大时间? 分析:做两次spfa,一次以X为源点到每头牛,再一次从每头牛到X,求出每头牛来回的最大时间即使答案...
  • qq_36312912
  • qq_36312912
  • 2017-07-30 09:04:34
  • 124

POJ 3268 Silver Cow Party (单源最短路Dijkstra+反向构图)

题目链接POJ3268题目大意给定一个有N(1≤\leN≤\le1000)个结点、M(1≤\leM≤\le10510^5)条单向边的有向正权图,求每个结点出发到X号结点再回来到初始位置的花费的最小值。...
  • yyt330507870
  • yyt330507870
  • 2017-04-26 00:17:22
  • 248

POJ 3268 D - Silver Cow Party(往返路程最短路)

题目链接:kuangbin带你飞 专题四 最短路练习 D - Silver Cow Party题意 n个农场,m条单向路,n个牛分别在n个农场,第x农场为终点,问每个牛从所在农场前往x农场的往返路...
  • to_be_better
  • to_be_better
  • 2016-01-15 00:38:27
  • 781

POJ3268————Silver Cow Party(最短路)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19688 ...
  • say_c_box
  • say_c_box
  • 2016-11-30 21:50:46
  • 161

poj-3286 Silver Cow Party

题目链接:http://poj.org/problem?id=3268 求牛参加聚会的往返最长的路径是多少。往返的时候翻转矩阵,再计算一次,两次求和。 #include #include #i...
  • u014427196
  • u014427196
  • 2015-01-29 10:26:53
  • 479
收藏助手
不良信息举报
您举报文章:POJ 3268 Silver Cow Party (最短路)
举报原因:
原因补充:

(最多只允许输入30个字)