poj3268

链接:点击打开链接

题意:给定一些路线和花费,然后N头牛,每头牛要求按照最短路走到X处,并用最短路在返回,问这些牛中所有路线里最大值是多少

代码:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#define maxx 99999999
using namespace std;
int n,m,x;
int dis[1005][1005],dis1[1005],dis2[1005],vis[1005];
void dz(){                              //矩阵转置
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<i;j++)
    swap(dis[i][j],dis[j][i]);
}
void dijkstra(int temp[]){              //这个题n的范围是1000,用floyd算法肯定会超时
    int i,j,u,cur;                      //因此想到dijkstra,从x点返回时的最短路就是dijkstra
    for(i=1;i<=n;i++){                  //模板,关键在于如何到达X时是最短路
        temp[i]=dis[x][i];
        vis[i]=0;
    }                                   //这是一个有向图因此只要将i到j的花费和j到i的花费
    temp[x]=0;vis[x]=1;                 //颠倒一下就可以套用dijkstra模板,因此也就是将dis
    for(i=2;i<=n;i++){                  //矩阵转置
        cur=maxx;u=x;
        for(j=1;j<=n;j++){
            if(!vis[j]&&temp[j]<cur){
                cur=temp[j];
                u=j;
            }
        }
        vis[u]=1;
        for(j=1;j<=n;j++)
        if(!vis[j]&&dis[u][j]<maxx)
        temp[j]=min(temp[j],temp[u]+dis[u][j]);
    }
}                                       //dijkstra模板
int main(){
    int i,j,k,a,b,c,sum;
    while(scanf("%d%d%d",&n,&m,&x)!=EOF){
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        dis[i][j]=maxx;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            dis[a][b]=c;
        }
        dijkstra(dis1);
        dz();
        dijkstra(dis2);
        sum=-1;
        for(i=1;i<=n;i++){
            if(dis1[i]==maxx||dis2[i]==maxx)
            continue;                   //如果这头牛走不到X则不考虑继续循环
            sum=max(sum,dis1[i]+dis2[i]);
        }
        printf("%d\n",sum);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 17:14:50

poj3268的相关文章

poj3268俩次SPFA。。。。。

Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road i re

POJ-3268 Silver Cow Party---正向+反向Dijkstra

题目链接: https://vjudge.net/problem/POJ-3268 题目大意: 有编号为1-N的牛,它们之间存在一些单向的路径.给定一头牛的编号X,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求所有牛从开始到回家的时间是多少? 思路: 所有牛都回到了家所花费的时间就是这些牛中花费时间的最大者,可以正向的Dijkstra求出从X到每个点的最短时间,然后一个骚操作:将所有边反向(swap(Map[i][j], Map[j][i])),再从x用dijkstra求出X到每个点的最

poj3268 Silver Cow Party (SPFA求最短路)

其实还是从一个x点出发到所有点的最短路问题.来和回只需分别处理一下逆图和原图,两次SPFA就行了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #

Silver Cow Party.(POJ-3268)

本来想用Floyd算法,可惜超时,毕竟复杂度太高,而且并没有必要求出任意两点间的最短距离. 求两点间的最短路有两种方法,dijkstra和Bellman ,前者不能有负圈,后者可以有负圈,另外,Floyd也可以求带负圈的最短距离. 我们只需要求出x到其他个点的最短距离和个点到它的最短距离就行了.当然,我所写的还求了很多多余的量,是可以优化的. #include<cstdio> #include<cstring> #include<iostream> #include&l

POJ3268 Silver Cow Party

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18713   Accepted: 8561 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of 

POJ-3268 Silver Cow Party( 最短路 )

题目链接:http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way road

poj3268(最短路)

题目连接:http://poj.org/problem?id=3268 题意:给出n个点和m条单向边,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出. 分析:先跑一遍dij求出x到其他点的最短距离,再反向建图,求出各点到达x的最短距离,然后枚举一下即可. #include <cstdio> #include <cstring> #include <strin

POJ 1511 POJ3268

1511是入门的题目 两次spfa求最小的值.一次正向求1到所有点的最短路,一次反向求最短路 然后两次的答案相加得到答案. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <queue> 6 7 #define inf 10000000000000LL 8 9 using namespace std; 10 1

poj3268 最短路

题意:一些牛要从各自的农场到某一个指定农场X,然后再回各自的农场,给出一系列单向边,求总路程最短.这题看似麻烦,因为全部从X点返回各自农场是一个X到其他所有点的最短路径问题,但是从各自点到X点貌似就是N个点各自的最短路了.但其实可以这样,从所有点到X点就是逆的X点到其他点的过程,只不过走的路径也是反的,那么其实就很简单了,正向建边用于计算从X点返回各自点,而反向建边构成一张新的图,也是计算从X点返回各点的最短路径,其实这些边本来是从各点到X,但是反向建之后就变成了X到各点了,然后就变成简单的一点

POJ3268(Dijkstra)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13103   Accepted: 5883 题目链接:http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow