题目意思很简单,就是求最短路,但是,路径是单向的,所以要正着dij一遍,反着dij一遍,再求两次和的最大值,也可以创建两个图,这样,只要对两个图分别dij一遍一次,就不要写两个dij函数了,普通dij很久没复习了,来学习一下堆优化后的dij吧,提交代码只要了35ms的时间。
题目描述
图灵杯个人赛就要开始了,蔡老板召集俱乐部各部门的部长开会。综合楼有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
:首先来是两个结构体
struct qnode{
int v,c;
qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator <(const qnode &r)const
{
return c>r.c;
}
};
优先队列结构体,
重载qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator <(const qnode &r)const
{
return c>r.c;
}
//自动排序
struct edge
{
int v,cost;
edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
v是图上的点,cost是权值。
再来建图函数:
void addedge(int u,int v,int w){
E[u].push_back(edge(v,w));
}
堆E是一个图,E【u】.push_back是在堆E的u的这一个一维数组末尾加上一个信息,u是起始点v是到达点,cost是u到v的权值。(vector用法)。
代码如下:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <queue>
#include <string.h>
#define MAXX 0x3f3f3f3f
#define siz 1005
using namespace std;
struct qnode{
int v,c;
qnode(int _v=0,int _c=0):v(_v),c(_c){}
bool operator <(const qnode &r)const
{
return c>r.c;
}
};
struct edge
{
int v,cost;
edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<edge>E[siz];
vector<edge>EE[siz];
int vis[siz];
int dist[siz];
int distt[siz];
int n,m,x;
int ans;
void dijstra(int n,int start){
int i,j;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
dist[i]=MAXX;
}
priority_queue<qnode>que;
while(!que.empty()){
que.pop();
}
dist[start]=0;
que.push(qnode(start,0));
qnode tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u]==1) continue;
vis[u]=1;
for(j=0;j<E[u].size();j++)
{
int v=E[tmp.v][j].v;
int cost=E[u][j].cost;
if(!vis[v]&&dist[v]>dist[u]+cost){
dist[v]=dist[u]+cost;
que.push(qnode(v,dist[v]));
}
}
}
}
void dijstra2(int n,int start){
int i,j;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
distt[i]=MAXX;
}
priority_queue<qnode>que;
while(!que.empty()){
que.pop();
}
distt[start]=0;
que.push(qnode(start,0));
qnode tmp;
while(!que.empty())
{
tmp=que.top();
que.pop();
int u=tmp.v;
if(vis[u]==1) continue;
vis[u]=1;
for(j=0;j<EE[u].size();j++)
{
int v=EE[tmp.v][j].v;
int cost=EE[u][j].cost;
if(!vis[v]&&distt[v]>distt[u]+cost){
distt[v]=distt[u]+cost;
que.push(qnode(v,distt[v]));
}
}
}
}
void addedge(int u,int v,int w){
E[u].push_back(edge(v,w));
}
void addedge2(int u,int v,int w){
EE[u].push_back(edge(v,w));
}
int main()
{
while(scanf("%d%d%d",&n,&m,&x)!=EOF){
int a,b,t;
int i,j;
for(i=0;i<siz;i++){
E[i].clear();
EE[i].clear();
}
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&t);
addedge(a,b,t);
addedge2(b,a,t);
}
ans=0;
dijstra(n,x);
dijstra2(n,x);
for(i=1;i<=n;i++){
dist[i]=dist[i]+distt[i];
}
ans=-1;
for(i=1;i<=n;i++){
if(dist[i]>ans) ans=dist[i];
}
cout<<ans<<endl;
}
return 0;
}