【CF 666B】World Tour

来源:互联网 发布:python tkiner 编辑:程序博客网 时间:2024/05/16 18:00

Description

Cicasso是一个著名的雕塑家。
现在他想去城市之间旅游,他是一个聪明的人,所以从一个城市到另一个城市他只会走最短路。他想游览全国的风景,所以他想走的路的总长度尽量长,但是经费有限,他只能去四个城市,而且这四个城市不能重复(在途中经过的城市不计算,例如 ,他要去的四个城市有上标,[1, 5, 2, 4],这样是合法的)
注意,道路是单向路,并且距离都为1。

Solution

又裸又水的题目。
预处理出两两点之间的最短路径。
然后找出每个点的最短路中到达最远的两个点,然后两两匹配就可以了。

Code

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<queue>#include<algorithm>#define rep(i,l,r) for(int i=l;i<=r;i++)#define per(i,r,l) for(int i=r;i>=l;i--)#define mmt(a,v) memset(a,v,sizeof(a))#define tra(i,u) for(int i=head[u];i;i=e[i].next)using namespace std;const int N=3000+5;const int M=5000+5;struct Edge{int to,next;};int head[N],cnt;Edge e[M];void ins(int u,int v){e[++cnt]=(Edge){v,head[u]};head[u]=cnt;}int d[N][N],n;void bfs(){    queue<int>qs,q;    mmt(d,-1);    rep(i,1,n){        d[i][i]=0;        qs.push(i);        q.push(i);    }    while(!q.empty()){        int s=qs.front(),u=q.front();qs.pop();q.pop();        tra(i,u){            int v=e[i].to;            if(d[s][v]==-1){                d[s][v]=d[s][u]+1;                qs.push(s);q.push(v);            }        }    }}int p[2][N],pt[2][N];void build(){    rep(i,1,n){        p[0][i]=p[1][i]=pt[0][i]=pt[1][i]=i;        rep(j,1,n){            if(d[i][j]>d[i][p[0][i]])p[1][i]=p[0][i],p[0][i]=j;            else if(d[i][j]>d[i][p[1][i]])p[1][i]=j;            if(d[j][i]>d[pt[0][i]][i])pt[1][i]=pt[0][i],pt[0][i]=j;            else if(d[j][i]>d[pt[1][i]][i])pt[1][i]=j;        }    }}bool check(int a,int b,int c,int d){    return a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d;}int main(){    //freopen("a.in","r",stdin);    int m;scanf("%d%d",&n,&m);    while(m--){        int u,v;scanf("%d%d",&u,&v);        ins(u,v);    }    bfs();build();    int ans=-1,t1,t2,t3,t4;    rep(i,1,n)rep(j,1,n)    if(i!=j&&d[i][j]!=-1)    rep(k1,0,1)rep(k2,0,1){        int a=pt[k1][i],b=p[k2][j];        if(check(a,i,j,b)&&d[a][i]+d[i][j]+d[j][b]>ans)        ans=d[a][i]+d[i][j]+d[j][b],t1=a,t2=i,t3=j,t4=b;    }    printf("%d %d %d %d\n",t1,t2,t3,t4);    return 0;}
1 0
原创粉丝点击