比较简单,没什么好说的,几乎就是模版题了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn=100010;
const int INF=1e9;
int n,m,x,a,b,c,d[maxn],vis[maxn];
struct Node
{
int d,u;
bool operator < (const Node& a)const
{
return d>a.d;
}
};
struct Edge
{
int u,v,w;
};
vector<Edge> edge;
vector<int> g[maxn];
void init()
{
memset(d,0,sizeof(d));
}
void add_edge(int u,int v,int w)
{
Edge p;
p.u=u;
p.v=v;
p.w=w;
edge.push_back(p);
g[u].push_back(edge.size()-1);
}
void dijkstra(int u)
{
for(int i=1;i<=n;i++)
d[i]=INF;
memset(vis,0,sizeof(vis));
d[u]=0;
priority_queue<Node> q;
Node p;
p.d=d[u];
p.u=u;
q.push(p);
while(!q.empty())
{
Node t=q.top();
q.pop();
u=t.u;
if(vis[u])
continue;
vis[u]=true;
for(int k=0;k<g[u].size();k++)
{
Edge e=edge[g[u][k]];
if(d[e.v]>d[e.u]+e.w)
{
d[e.v]=d[e.u]+e.w;
Node tp;
tp.d=d[e.v];
tp.u=e.v;
q.push(tp);
}
}
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&x)!=EOF)
{
init();
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
int ans=-1;
for(int i=1;i<=n;i++)
{
int sum=0;
dijkstra(i);
sum+=d[x];
dijkstra(x);
sum+=d[i];
ans=max(ans,sum);
}
printf("%d\n",ans);
}
return 0;
}