POJ 3268Silver Cow Party dijkstra();

来源:互联网 发布:linux 查看环境路径 编辑:程序博客网 时间:2024/05/16 10:05

题意:输入n,m,x,分别表示有n头牛,m条单向路径,以第x头牛(下用牛X表示)为起点。

每头牛都将会1.先拜访牛X,2.后返回自己原先的位置。求出所有牛花费时间中的最大值。

解题方法:首先,2.每头牛返回到自己原先位置,这个容易求,也就是求牛X到每头牛的最短时间(单源最短路)。

而求每头牛拜访牛X的时间,可以将题目所给的所有路径,全部调反,然后再求牛X到每头牛的最短时间(单源最短路)。

最后相加,找出最大值即可。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m,s,dis1[1005],map[1005][1005],dis2[1005];bool vis[1005];const int inf=1e9;int dijkstra(){memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i)dis1[i]=map[s][i];vis[s]=1;int u;for(int i=0;i<n-1;++i){int mins=inf;for(int j=1;j<=n;++j){if(dis1[j]<mins&&!vis[j]){u=j;mins=dis1[j];}}vis[u]=1;for(int j=1;j<=n;++j){dis1[j]=min(dis1[j],dis1[u]+map[u][j]);}}for(int i=1;i<=n;++i){for(int j=1;j<i;++j){int c=map[i][j];map[i][j]=map[j][i];map[j][i]=c;}}memset(vis,0,sizeof(vis));for(int i=1;i<=n;++i)dis2[i]=map[s][i];vis[s]=1;for(int i=0;i<n-1;++i){int mins=inf;for(int j=1;j<=n;++j){if(!vis[j]&&dis2[j]<mins){u=j;mins=dis2[j];}}vis[u]=1;for(int j=1;j<=n;++j){dis2[j]=min(dis2[j],dis2[u]+map[u][j]);}}int ans=-1;for(int i=1;i<=n;++i){ans=max(ans,dis1[i]+dis2[i]);}return ans;}int main(){while(scanf("%d%d%d",&n,&m,&s)==3){for(int i=0;i<=n;++i){for(int j=0;j<=n;++j)map[i][j]=inf;map[i][i]=0;}int a,b,c;for(int i=0;i<m;++i){scanf("%d%d%d",&a,&b,&c);map[a][b]=c;}printf("%d\n",dijkstra());}}

0 0
原创粉丝点击