P1821 [USACO07FEB]银牛派对Silver Cow Party
我当时看着邻接矩阵存的下,就想来一发floyed,然后发现了很多问题。
floyed的判定条件非常严格,否则会挂。
初始化为inf
if(d[i][k]+d[k][j]<d[i][j]&&d[i][k]!=inf&&d[k][j]!=inf&&(i!=j&&i!=k&&j!=k))   80分

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define inf 2147483647
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar()

using namespace std;
int n,m,t,x,y,v,k;
int d[1010][1010],ans=-9999999;

void in(int &x)
{
    char c=g();x=0;
    while(c<'0'||c>'9')c=g();
    while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
}
void o(int x)
{
    if(x>9)o(x/10);
    p(x%10+'0');
}
int main()
{
     in(n),in(m),in(t);
     For(i,1,n)
       For(j,1,n)
         d[i][j]=inf;
     For(i,1,m)
     in(x),in(y),in(d[x][y]);
     For(k,1,n)
       For(i,1,n)
         For(j,1,n)
           if(d[i][k]+d[k][j]<d[i][j]&&d[i][k]!=inf&&d[k][j]!=inf&&(i!=j&&i!=k&&j!=k))
                d[i][j]=d[i][k]+d[k][j];
           
     For(i,1,n)
         if(d[i][t]!=inf&&d[t][i]!=inf)
         ans=max(ans,d[i][t]+d[t][i]);
     o(ans);
     return 0;
}

 

 

正解是正常跑一遍spfa,然后反向建边,再跑一遍spfa,以x跑单源最短路径。

 

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define inf 2147483647
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar()

using namespace std;
int n,m,t,x,y,z,ans=-89998899;
int d1[1010],d2[1010];
bool vis[1010];
queue<int>q;
struct node
{
    int n,v;
    node *next;
}*e1[100010],*e2[100010];

void in(int &x)
{
    char c=g();x=0;
    while(c<'0'||c>'9')c=g();
    while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
}
void o(int x)
{
    if(x>9)o(x/10);
    p(x%10+'0');
}

void push(int x,int y,int v,node *&temp)
{
    node *p;
    p=new node();
    p->n=y;
    p->v=v;
    if(temp==NULL)
    temp=p;
    else
    {
        p->next=temp->next;
        temp->next=p;
    }
}

void spfa(int x,int *d,node *e[])
{
    d[x]=0;
    q.push(x);
    node *p;
    int t;
    while(q.size()>0)
    {
        t=q.front();
        p=e[t];
        vis[t]=true;
        while(p!=NULL)
        {
            if(d[t]+p->v<d[p->n])
            {
                d[p->n]=d[t]+p->v;
                if(!vis[p->n])
                q.push(p->n);
            }
            p=p->next;
        }
        vis[t]=false;
        q.pop();
    }
}

int main()
{
     in(n),in(m),in(t);
     For(i,1,m)
     {
         in(x),in(y),in(z);
         push(x,y,z,e1[x]);
         push(y,x,z,e2[y]);
     }
     For(i,1,n)
     d1[i]=inf,d2[i]=inf;
     spfa(t,d1,e1);
     spfa(t,d2,e2);
     For(i,1,n)
     ans=max(ans,d1[i]+d2[i]);
     o(ans);
     return 0;
}