FZU/FOJ 2243 Daxia like uber【最短路SPFA+思维】
2016-08-31 13:14
344 查看
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 84 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();
}
}
相关文章推荐
- 【最短路】FOJ 2243 Daxia like uber
- FZU - 2243 - Daxia like uber (单源最短路)
- 【最短路】FOJ 2243 Daxia like uber
- FZU 2243 - Daxia like uber (最短路)
- FZUOJ Problem 2243 Daxia like uber (最短路+汗水)
- FZU Problem 2243 Daxia like uber(最短路)
- FZU 2243 Daxia like uber
- fzu 2243 Daxia like uber
- FZU 2243 Daxia like uber
- Fzu 2261 浪里个浪【思维+最短路】
- 【最短路--思维】hdu2066 一个人的旅行、fzu2261 浪里个浪
- FZU 2169 shadow【最短路+思维】
- FZU 2242 - Daxia like acute triangle
- hrbust 1355 Leyni,罗莉和XianGe【最短路SPFA+思维】好题
- 51nod 1445 变色DNA【最短路SPFA+思维】
- FOJ有奖月赛-2016年8月 Problem A Daxia & Wzc's problem(找规律)
- 景驰无人驾驶 1024 编程邀请赛 A 题 【最短路 + 思维】
- FZU 2231 平行四边形数(几何)(思维)
- FZU 2127 养鸡场【思维】
- bfs最短路+dp(FZU 2186)