FZU/FOJ 2243 Daxia like uber【最短路SPFA+思维】

原创 2016年08月31日 13:14:05

 Problem 2243 Daxia like uber

Accept: 29    Submit: 63
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

daxia兼职开uber,现在接到一个两人拼车单.已知如下信息:

1. 地图上共有n个点,m条有向行驶通道.

2. daxia位于点s;

3. 客人一位于点x1,目的地为y1;

4. 客人二位于点x2,目的地为y2.

请帮daxia计算送完两个乘客的最短行驶路程.

 Input

测试包含多组数据,每组数据第一行包含两个整数:n(1<=n<=1000),m(1<=m<=100000).

第二行包含五个整数:s,x1,y1,x2,y2(1<=s,x1,y1,x2,y2<=n).

接下来包含m行,每行三个整数:u,v,d(1<=u,v<=n,1<=d<=100).

 Output

每组数据输出一行一个整数表示送完两个乘客的最短行驶路程,数据保证肯定能送到.

 Sample Input

4 8
4 1 2 2 3
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3

 Sample Output

11

 Hint

样例接送路线:(4)->2->(1)->(2)->1->(3)

 Source

FOJ有奖月赛-2016年8月(daxia专场之过四题方有奖)


思路:


1、首先求出来以s,x1,y1,x2,y2五个点为起点的单源最短路。


2、然后我们讨论到底如何接送客人才能达到最优:

①无论我们选择从起点先到哪个点去接客人,我们都有可能出现重复路径的问题,假如我选择去接客人1,那么其最短路上可能已经经过客人2所在的地点了,如果我们再折回去解客人2,明显走了多余的路径,我们想办法解决这样一个问题,整个问题就变得简单了。

②其实解决这样一个问题也不难,我们这样考虑:如果在接客人1的路径上经过了客人2所在的点,那么s------------->1-------->2就是一个重复走过点了的情况,那么其实这样 走:S----------->2----------->1就是一个最短路径的选择。


3、那么问题变得清晰了很多,我们不妨枚举所有情况:

s----------->x1----------->y1----------->x2----------->y2

s----------->x1----------->x2----------->y1----------->y2

s----------->x1----------->x2----------->y2----------->y1

s----------->x2----------->y2----------->x1----------->y1

s----------->x2----------->x1----------->y1----------->y2

s----------->x2----------->x1----------->y2----------->y1

这样:即使有某一种情况会有重复行走路径的情况,那么对应一定有一种情况没有重复走这样的路径,那么枚举出六种情况,维护最小值输出即可。


Ac代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
#define INF 2000000000
struct node
{
    int from;
    int to;
    int next;
    int w;
}e[1000000];
int n,m;
int s,s1,s2,e1,e2,cont;
int dis[10][1200];
int ss[10];
int vis[1200];
int head[1200];
void add(int from,int to,int w)
{
    e[cont].to=to;
    e[cont].w=w;
    e[cont].next=head[from];
    head[from]=cont++;
}
void SPFA(int ss,int d)
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)dis[d][i]=INF;
    dis[d][ss]=0;
    queue<int >s;
    s.push(ss);
    while(!s.empty())
    {
        int u=s.front();
        s.pop();
        vis[u]=0;
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].to;
            int w=e[i].w;
            if(dis[d][v]>dis[d][u]+w)
            {
                dis[d][v]=dis[d][u]+w;
                if(vis[v]==0)
                {
                    vis[v]=1;
                    s.push(v);
                }
            }
        }
    }
}
void Slove()
{
    int sum[7];
    int num[1200];
    num[s]=1;
    num[s1]=2;
    num[s2]=3;
    num[e1]=4;
    num[e2]=5;
    sum[0]=dis[num[s]][s1]+dis[num[s1]][e1]+dis[num[e1]][s2]+dis[num[s2]][e2];
    sum[1]=dis[num[s]][s1]+dis[num[s1]][s2]+dis[num[s2]][e1]+dis[num[e1]][e2];
    sum[2]=dis[num[s]][s1]+dis[num[s1]][s2]+dis[num[s2]][e2]+dis[num[e2]][e1];
    sum[3]=dis[num[s]][s2]+dis[num[s2]][e2]+dis[num[e2]][s1]+dis[num[s1]][e1];
    sum[4]=dis[num[s]][s2]+dis[num[s2]][s1]+dis[num[s1]][e1]+dis[num[e1]][e2];
    sum[5]=dis[num[s]][s2]+dis[num[s2]][s1]+dis[num[s1]][e2]+dis[num[e2]][e1];
    sort(sum,sum+6);
    printf("%d\n",sum[0]);
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        cont=0;
        memset(head,-1,sizeof(head));
        scanf("%d%d%d%d%d",&s,&s1,&e1,&s2,&e2);
        ss[1]=s;
        ss[2]=s1;
        ss[3]=s2;
        ss[4]=e1;
        ss[5]=e2;
        for(int i=0;i<m;i++)
        {
            int x,y,w;
            scanf("%d%d%d",&x,&y,&w);
            add(x,y,w);
        }
        for(int i=1;i<=5;i++)
        {
            SPFA(ss[i],i);
        }
        Slove();
    }
}



版权声明:0.0小白有写的不好不对的地方请指出~

【最短路】FOJ 2243 Daxia like uber

题目链接:   http://acm.fzu.edu.cn/problem.php?pid=2243 题目大意:   给一张N个点M条边的有向图,从s出发,把在x1的人送到y1,在x...
  • u010568270
  • u010568270
  • 2016年08月18日 17:49
  • 290

FZU 2243 - Daxia like uber (最短路)

Problem 2243 Daxia like uber Accept: 47    Submit: 121 Time Limit: 1000 mSec    Memory Limit :...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017年11月15日 15:46
  • 80

FZU 2243 Daxia like uber

Problem Description daxia兼职开uber,现在接到一个两人拼车单.已知如下信息: 1. 地图上共有n个点,m条有向行驶通道. 2. daxia位于点s; 3. 客人...
  • Waves___
  • Waves___
  • 2016年09月09日 00:38
  • 88

FZU Problem 2243 Daxia like uber(最短路)

FZU Problem 2243 Daxia like uber(最短路)
  • queuelovestack
  • queuelovestack
  • 2016年08月22日 10:13
  • 430

fzu 2243 Daxia like uber

http://acm.fzu.edu.cn/problem.php?pid=2243 #include #include #include #include #includ...
  • threeh20
  • threeh20
  • 2017年11月11日 20:57
  • 80

FZU - 2243 - Daxia like uber (单源最短路)

Problem 2243 Daxia like uber Accept: 43    Submit: 115 Time Limit: 1000 mSec    Memory Limit :...
  • w326159487
  • w326159487
  • 2017年11月11日 22:20
  • 34

F - Daxia like uber 【最短路】

daxia兼职开uber,现在接到一个两人拼车单.已知如下信息: 地图上共有n个点,m条有向行驶通道. daxia位于点s; 客人一位于点x1,目的地为y1; 客人二位于点x2,目的地为y2. 请帮d...
  • Irish_Moonshine
  • Irish_Moonshine
  • 2017年11月12日 23:29
  • 51

FZUOJ Problem 2243 Daxia like uber (最短路+汗水)

这是一题用汗水收获的题。 在纸上用”树-分支“方法画一下发现只有6种走法。 所以求5遍最短路,记录下需要的值,然后比较一下哪种走法最短。 比较6种走法,只能一个个的写,用汗水收获~ 【代码】 ...
  • AngOn823
  • AngOn823
  • 2016年09月09日 20:56
  • 183

FZU 2242 - Daxia like acute triangle

Problem 2242 Daxia like acute triangle Accept: 26    Submit: 99 Time Limit: 1000 mSec    Memor...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017年11月15日 15:44
  • 66

FZU 2242 Daxia like acute triangle

半径为r的圆上有n个不重复的点,请你帮daxia计算这些点能构成多少个不同的锐角三角形. Input 测试包含多组数据,每组数据第一行包含两个整数:n(1 接下来包含n行,每行包含一...
  • jtjy568805874
  • jtjy568805874
  • 2016年12月19日 14:57
  • 182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FZU/FOJ 2243 Daxia like uber【最短路SPFA+思维】
举报原因:
原因补充:

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