文章目录
前言
提示:代码以AC,如果没有会在代码前进行说明
系列文章目录
一、蔡老板的会议
题目描述
图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有N (1<=N<=1000)间办公室,编号1~N每个办公室有一个部长在工(mo)作(yu),其中X号是蔡老板的办公室,会议也将在X(1<=X<=N)号办公室举行。综合楼的构造极其特殊,这N个办公室之间M(1<=M<=100,000)条单向走廊。通过第i条路将需要花费Ti(1<=Ti<=100)单位时间。
由于工作很忙,开完会之后各部长需要返回自己的办公室。他们会选择最短时间的最优路径。
为了合理安排接下来的工作,蔡老板想知道,【来回最久的】【!!!】那个部长在路上花费的时间是多少。
输入描述
第一行:用空格隔开的三个数N,M和X
接下来的M行:每行有用空格隔开的三个数Ai,Bi和Ti,表示从A点到B点花费的时间Ti
输出描述
一个int型的数,表示花费时间的最大值
样例输入
4 4 1
1 2 1
2 3 1
3 4 3
4 1 3
样例输出
8
分析
单向图求最短路径,果断Dijkstra
AC代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int inf = 0x3f3f3f3f;
int n, m, x;
int mp1[maxn][maxn],mp2[maxn][maxn];
int dis1[maxn], dis2[maxn];
int visit[maxn];
void djsitela(int (*mp)[1005], int * dis)
{
memset(visit,0,sizeof(visit));
visit[x] = 1;
for(int i = 1;i <= n;i ++)
dis[i] = mp[x][i];
for(int i = 1;i <= n;i ++)
{
int k = -1, minn = inf;
for(int j = 1;j <= n;j ++)
{
if(!visit[j] && dis[j] < minn)
{
minn = dis[j];
k = j;
}
}
if(k == -1 )
break;
visit[k] = 1;
for(int j = 1;j <= n;j ++)
{
if(!visit[j] && dis[j] > dis[k] + mp[k][j])
dis[j] = dis[k