首页 > 代码库 > POJ 3268 Silver Cow Party
POJ 3268 Silver Cow Party
求来回最短路加起来最长的一条。
两次SPFA,然后选某个点的来回最长。(有向图)
Dijkstra+邻接矩阵 比较方便建立 反向图。
我用SPFA+2个邻接表(正图+反图),C++ 32ms。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<queue> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<cmath> #define INF 0x7fffffff #define eps 1e-6 using namespace std; int n,m,start; struct lx { int v,t; }; vector<lx>g1[1001]; vector<lx>g2[1001]; int dis1[1001]; int dis2[1001]; void SPFA(int *dis,vector<lx>g[]) { bool vis[1001]; queue<int>q; for(int i=1;i<=n;i++) dis[i]=INF,vis[i]=0; vis[start]=1,dis[start]=0; q.push(start); while(!q.empty()) { int u=q.front();q.pop(); vis[u]=0; for(int j=0;j<g[u].size();j++) { int v=g[u][j].v; int t=g[u][j].t; if(dis[v]>dis[u]+t) { dis[v]=dis[u]+t; if(!vis[v]) { vis[v]=1; q.push(v); } } } } } int main() { while(scanf("%d%d%d",&n,&m,&start)!=EOF) { for(int i=1;i<=n;i++) g1[i].clear(),g2[i].clear(); while(m--) { int u,v,t; scanf("%d%d%d",&u,&v,&t); lx now; now.v=v,now.t=t; g1[u].push_back(now); now.v=u; g2[v].push_back(now); } SPFA(dis1,g1); SPFA(dis2,g2); int ans=0; for(int i=1;i<=n;i++) ans=max(ans,dis1[i]+dis2[i]); printf("%d\n",ans); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。