#include <bits/stdc++.h> using namespace std; int n,m,o; int dis[1005][1005]; int vt[1005][1005]; int from[1005]; struct _tuple { int y; int val; }; vector <_tuple> A[10005]; struct _tuple2 { int idx; int data; bool operator<(const _tuple2 &a)const { return data>a.data; } }; priority_queue <_tuple2> pq_dist; void input() { ////freopen("in.txt","r",stdin); scanf("%d %d %d",&n,&m,&o); int t1,t2,t3; for(int i=0; i<m; i++) { scanf("%d %d %d",&t1,&t2,&t3); A[t1].push_back({t2,t3}); } } void dijkstra(int org) { for(int j=1;j<=n;j++){ for(int i=1; i<=n; i++) { dis[org][i]=0x7fffffff; vt[j][i]=0; } } dis[org][org]=0; vt[org][org]=1; from[org]=-1; _tuple2 tmp; int _min; int _minidx; for(int i=0; i<A[org].size(); i++) { dis[org][A[org][i].y]=A[org][i].val; tmp.idx=A[org][i].y; tmp.data=A[org][i].val; from[A[org][i].y]=org; pq_dist.push(tmp); //printf("%d %d %d\n",org,tmp.idx,tmp.data); } while(!pq_dist.empty()) { while(!pq_dist.empty()) { _min=pq_dist.top().data; _minidx=pq_dist.top().idx; //printf("%d %d %d\n",org,pq_dist.top().idx,pq_dist.top().data); pq_dist.pop(); //printf(" %d %d %d\n",org,from[_minidx],_minidx); if(vt[from[_minidx]][_minidx]==0) { //printf(" %d %d %d\n",org,from[_minidx],_minidx); break; } } if(vt[from[_minidx]][_minidx]==1) { break; } vt[from[_minidx]][_minidx]=1; int t_node; int t_val; for(int j=0; j<A[_minidx].size(); j++) { t_node=A[_minidx][j].y; t_val=A[_minidx][j].val; //printf(" %d %d %d %d\n",_minidx,t_node,t_val,vt[_minidx][t_node]); if(vt[_minidx][t_node]==0&&dis[org][t_node]>dis[org][_minidx]+t_val) { dis[org][t_node]=dis[org][_minidx]+t_val; tmp.idx=t_node; tmp.data=dis[org][t_node]; pq_dist.push(tmp); //printf(" %d %d %d\n",_minidx,t_node,dis[org][t_node]); from[t_node]=_minidx; //vt[_minidx][t_node]=0; /*for(int k=0;k<A[t_node].size();k++){ vt[t_node][A[t_node][k].y]=0; //printf(" %d %d %d",t_node,k,) }*/ } } } } int main() { int tmp; int _max=0; input(); /*for(int i=1;i<=m;i++){ for(int j=0;j<A[i].size();j++){ printf("%d %d %d\n",i,A[i][j].y,A[i][j].val); } }*/ for(int i=1; i<=n; i++) { dijkstra(i); } /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%d ",dis[i][j]); } printf("\n"); }*/ for(int i=1;i<=n;i++){ tmp=dis[i][o]+dis[o][i]; //printf("%d %d\n",i,tmp); if(_max<tmp) { _max=tmp; } } printf("%d",_max); return 0; }

Comments
Post a Comment