D - Silver Cow Party
题意:从x点到其他各点再返回,所有最短路径中的最长路径
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> using namespace std; const int oo=100000007; struct node { int u,v,w; int next; }e1[100005],e2[100005]; int head1[100005],head2[100005]; int k1,k2; int dist1[100005],dist2[100005]; int visit1[100005],visit2[100005]; void Init(int n) { k1=k2=0; memset(head1,-1,sizeof(head1)); memset(head2,-1,sizeof(head2)); for(int i=1;i<=n;i++) { dist1[i]=oo; dist2[i]=oo; } } void add1(int u,int v,int w) { e1[k1].u=u; e1[k1].v=v; e1[k1].w=w; e1[k1].next=head1[u]; head1[u]=k1++; } void add2(int u,int v,int w) { e2[k2].u=u; e2[k2].v=v; e2[k2].w=w; e2[k2].next=head2[u]; head2[u]=k2++; } void spfa(int s,int head[],int visit[],int dist[],node e[]) { queue<int>q; q.push(s); memset(visit,0,sizeof(visit)); dist[s]=0; while(q.size()) { s=q.front(); visit[s]=0; q.pop(); for(int i=head[s];i!=-1;i=e[i].next) { int u=e[i].u; int v=e[i].v; int w=e[i].w; if(dist[u]+w<dist[v]) { dist[v] = dist[u] + w; if(visit[v]==0) { visit[v] = 1; q.push(v); } } } } } int main() { int n,m,x; while(~scanf("%d",&n)) { scanf("%d%d",&m,&x); Init(n); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add1(u,v,w); add2(v,u,w); } spfa(x,head1,visit1,dist1,e1); spfa(x,head2,visit2,dist2,e2); int Max=0; for(int i=1;i<=n;i++) { if(dist1[i]+dist2[i]>Max) Max=dist1[i]+dist2[i]; } printf("%d\n",Max); } return 0; }