【USACO 2007 February Silver】农场派对

Description
  N(1<=N<=1000)头牛要去参加一场在编号为x(1<=x<=N)的牛的农场举行的派对。有M(1<=M<=100000)条有向道路,每条路长Ti(1<=Ti<=100);每头牛都必须参加完派对后回到家,每头牛都会选择最短路径。求这N头牛的最短路径(一个来回)中最长的一条的长度。 特别提醒:可能有权值不同的重边。
Input
  第1行:3个空格分开的整数N, M, X
  第2..M+1行:3个空格分开的整数Ai, Bi, Ti,表示有一条从Ai到Bi的路,长度为Ti
Output
  第1行:最长最短路的长度
Sample Input
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
Sample Output
10


这么赤裸裸的最短路居然改了好长时间
有一点需要注意
就是关于如何求任意点到源点s的最短路
将邻接矩阵转置再跑dijkstra就ok了
代码冗长表介意

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 100000000;
using namespace std;
int g[1001][1001],dis1[1001],dis2[1001],n,m,x,maxn=-1;
void dijkstra(int dis[])
{
    int i,j,v,min;
    int visit[1005];
    memset(visit,0,sizeof(visit));
    for(i=1;i<=n;i++)
    dis[i]=g[x][i];
    dis[x]=0;
    visit[x]=1;
    for(i=1;i<=n;i++)
    {
        min=INF;
        for(j=1;j<=n;j++)
        {
            if(!visit[j]&&dis[j]<min)
            {
                min=dis[j];
                v=j;
            }
        }
        visit[v]=1;
        for(j=1;j<=n;j++)
        if(!visit[j]&&dis[v]+g[v][j]<dis[j])
        dis[j]=dis[v]+g[v][j];
    }
}
void tran()
{
    int i,j,temp;
    for(i=1;i<=n;i++)
    for(j=1;j<=i;j++)
    {
        temp=g[i][j];
        g[i][j]=g[j][i];
        g[j][i]=temp;
    }
}
int main()
{
    int i,j,a,b,t;
   cin>>n>>m>>x;
   memset(g,127/3,sizeof(g));
   for(i=1;i<=m;i++)
   {
    cin>>a>>b>>t;
    if(g[a][b]>t) g[a][b]=t;
   } 
   dijkstra(dis1);
   tran();
   dijkstra(dis2);
   for(i=1;i<=n;i++)
    if(i!=x && dis1[i]+dis2[i]>maxn) maxn=dis1[i]+dis2[i];
   cout<<maxn;
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值