#include <iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int MAX=1005;
const int INF=10000000;
int n,m,x,dis[MAX],dis0[MAX];
typedef pair<int,int> P;
struct edge
{
int to,cost;
};
vector<edge> g[MAX],r[MAX];
void dijistra(int s,int* d)
{
priority_queue<P,vector<P>,greater<P> > que;
fill(d,d+MAX,INF);
d[s]=0;
que.push(P(0,s));
while(!que.empty())
{
P p=que.top();
que.pop();
int v=p.second;
if(d[v]<p.first)
continue;
for(int i=0;i<g[v].size();i++)
{
edge &e=g[v][i];
if(d[e.to]>d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
que.push(P(d[e.to],e.to));
}
}
}
}
void dijistra0(int s,int* d)
{
priority_queue<P,vector<P>,greater<P> > que;
fill(d,d+MAX,INF);
d[s]=0;
que.push(P(0,s));
while(!que.empty())
{
P p=que.top();
que.pop();
int v=p.second;
if(d[v]<p.first)
continue;
for(int i=0;i<r[v].size();i++)
{
edge &e=r[v][i];
if(d[e.to]>d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
que.push(P(d[e.to],e.to));
}
}
}
}
int main()
{
cin>>n>>m>>x;
int to,from,cost;
edge e;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&from,&to,&cost);
e.to=to;e.cost=cost;
g[from].push_back(e);
e.to=from;
r[to].push_back(e);
}
dijistra(x,dis);
dijistra0(x,dis0);
int M=0;
for(int i=1;i<=n;i++)
{
dis[i]+=dis0[i];
if(M<dis[i])
M=dis[i];
}
printf("%d\n",M);
return 0;
}
写的有些繁琐,不知道vector可以直接复制。
把g=r;可以直接省去一个调用函数。
题目很水,但还是很考验基础的,另外数据较水,其实不用想太多,n个dijistra也可以搞定