Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

1A spfa 300ms....附代码....前排大佬都是用矩阵转置的....有点烦....

Posted by love_5u at 2019-07-20 10:00:15 on Problem 3268
/*
这题是一个求最短路的题,有很多牛要参加舞会,我们要计算的是他们每头牛去舞会的路程+回家的路程最短路的和 ,最大的那头牛;那么题意就是求这个,我们的思路是
spfa  求每头牛去的距离,跟回去的距离,加起来,维护一个ans变量,最后输出,回去的路程可能跟去的路程不同,因为在舞会中,奶牛们可能会从其他奶牛哪里得知小路哦!!...然后回家就会很快呢
*/
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<queue>
const int  Maxn=1005;
const int INF=1e9+7;
using namespace std;
int vis[Maxn],dis[Maxn],head[Maxn],cnt[Maxn],e;
int dis1[Maxn];
int n,m,x;
queue<int>que;
struct Edge
{
    int start,end,next,w;
}ed[100001];
void ini()
{
    memset(head,-1,sizeof(head));
    e=0;
    while(!que.empty())que.pop();
}

void addedge(int u,int v,int c)
{
    ed[e].start=u;
    ed[e].end=v;
    ed[e].next=head[u];
    ed[e].w=c;
    head[u]=e++;
}

bool spfa(int s)        //bool是为了防止环路,但是这题没用到
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=INF;
        vis[i]=0;
        cnt[i]=0;
    }
    dis[s]=0;
    vis[s]=1;
    que.push(s);
    while(!que.empty())
    {
        int temp=que.front();
        que.pop();
        vis[temp]=0;
        for(int i=head[temp];i!=-1;i=ed[i].next)
        {
            int x=ed[i].start;
            int y=ed[i].end;
            int w=ed[i].w;
            if(dis[y]>dis[x]+w)
            {
                dis[y]=dis[x]+w;
                if(!vis[y])
                {
                    vis[y]=1;
                    if(++cnt[y]>n)
                    {
                        return true;
                    }
                    que.push(y);
                }
            }
        }
    }
    return false;
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&x)!=EOF)
    {
        ini();
        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            addedge(a,b,c);
        }
        int ans=-1;
        spfa(x);
        for(int i=1;i<=n;i++)
        {
            dis1[i]=dis[i];     //求出x点到各点的距离
        }
        for(int i=1;i<=n;i++)
        {
            int temp=0;
            if(i==x)continue;
            spfa(i);
            temp+=dis[x];           //加上的是去x的距离
            temp+=dis1[i];          //加上的是回家的距离
            ans=max(ans,temp);      //判断奶牛来回的最大距离
        }
       printf("%d\n",ans);
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator