1111. Online Map (30)

来源:互联网 发布:长江证券mac版本 编辑:程序博客网 时间:2024/06/11 23:49

1111. Online Map (30)
解题思路:
Dijkstra储存最短路径,dfs找最优路径

破题,呸(:з」∠)
AC代码

//简化了一下代码,2017.9.7#include <iostream>#include <cstdio>#include <vector>using namespace std;const int Inf=999999;int vn,an,s,e;vector<vector<int>> vT(512,vector<int>(512,Inf));//timeAdjMvector<vector<int>> vL(512,vector<int>(512,Inf));//lengthAdjMvector<int> sp,fp;//储存最终结果路径,最短和最快int mintime=Inf,ansdis=-1;//最短路径不唯一,取时间最短int minsect=Inf,anstim=-1;//最短时间不唯一,取最少交叉口void dijkstra(vector<vector<int>> &v,vector<vector<int>> &path)//dijkstra求解满足初始条件的所有解,v为邻接矩阵,path返回保存路径{    vector<int> dis(v[s]);    vector<bool> vis(vn,false);    vis[s]=true;    while(true)    {        int mind=Inf,u=-1;        for(int j=0;j<vn;++j)        {            if(!vis[j]&&dis[j]<mind) mind=dis[u=j];        }        if(u==-1) return;        vis[u]=true;        for(int w=0;w<vn;++w)        {            if(!vis[w]&&dis[w]>dis[u]+v[u][w])            {                dis[w]=dis[u]+v[u][w];                path[w].clear();                path[w].push_back(u);            }            else if(!vis[w]&&dis[w]==dis[u]+v[u][w])                path[w].push_back(u);        }    }}void shortpath(vector<vector<int>>&lenp,vector<int> &rp,int cur,int timesum,int dis)//dfs筛选最优路径{    if(s==cur&&timesum<mintime)    {        mintime=timesum;        sp=rp;        ansdis=dis;        return;    }    for(auto pre:lenp[cur])    {        rp.push_back(pre);        shortpath(lenp,rp,pre,timesum+vT[pre][cur],dis+vL[pre][cur]);        rp.pop_back();    }}void fastpath(vector<vector<int>>&timp,vector<int> &rp,int cur,int tim,int seccnt)//dfs筛选最优路径{    if(s==cur&&seccnt<minsect)    {        minsect=seccnt;        fp=rp;        anstim=tim;        return;    }    for(auto pre:timp[cur])    {        rp.push_back(pre);        fastpath(timp,rp,pre,tim+vT[pre][cur],seccnt+1);        rp.pop_back();    }}int main(int argc, char const *argv[]){    cin>>vn>>an;    for(int i=0;i<an;++i)    {        int u,w,oneway,length,time;        cin>>u>>w>>oneway>>length>>time;        vL[u][w]=length;        vT[u][w]=time;        if(oneway==0)        {            vL[w][u]=length;            vT[w][u]=time;        }    }    cin>>s>>e;    vector<vector<int>> timp(vn),lenp(vn);//时间路径,长度路径    for(int i=0;i<vn;++i)    {        if(vL[s][i]<Inf) lenp[i].push_back(s);        if(vT[s][i]<Inf) timp[i].push_back(s);    }    dijkstra(vL,lenp);    dijkstra(vT,timp);    vector<int> rp;//记录可能的路径    shortpath(lenp,rp,e,0,0);    fastpath(timp,rp,e,0,0);    if(sp==fp)    {        printf("Distance = %d; Time = %d: ",ansdis,anstim);        for(auto it=sp.rbegin();it!=sp.rend();++it)            printf("%d -> ",*it);        printf("%d\n",e);    }    else    {        printf("Distance = %d: ",ansdis);        for(auto it=sp.rbegin();it!=sp.rend();++it)            printf("%d -> ",*it);        printf("%d\n",e);        printf("Time = %d: ",anstim);        for(auto it=fp.rbegin();it!=fp.rend();++it)            printf("%d -> ",*it);        printf("%d\n",e);    }    return 0;}
//previous_code#include <cstdio>#include <vector>using namespace std;const int maxv=502,INF=0x7fffffff;int n,m,s,e;int arclen[maxv][maxv],arctim[maxv][maxv];int distim[maxv],dislen[maxv],vistim[maxv],vislen[maxv];vector<int> sp[maxv],temps,anss;vector<int> fp[maxv],tempf,ansf;int mintime=0x7fffffff,minsec=0x7fffffff;int distancex=0x7fffffff,time=0;void InitAdjMatrix(){    for(int i=0;i<n;++i)    {        for(int j=0;j<n;++j)        {            i==j?            arclen[i][j]=arclen[j][i]=arctim[i][j]=arctim[j][i]=0:            arclen[i][j]=arclen[j][i]=arctim[i][j]=arctim[j][i]=INF;        }    }}void InitDisArray(){    for(int i=0;i<n;++i)    {        dislen[i]=arclen[s][i];        if(arclen[s][i]<INF&&i!=s) sp[i].push_back(s);//前驱节点        distim[i]=arctim[s][i];        if(arctim[s][i]<INF&&i!=s) sp[i].push_back(s);//前驱节点    }}void ShortPath(){    int min,v;    vislen[s]=1;    for(int i=0;i<n;++i)    {        min=INF;        for(int k=0;k<n;++k)        {            if(vislen[k]==0&&dislen[k]<min)            {                min=dislen[k];                v=k;            }        }        vislen[v]=1;        for(int w=0;w<n;++w)        {            if(arclen[v][w]<INF&&vislen[w]==0)            {                if(dislen[v]+arclen[v][w]<dislen[w])                {                    dislen[w]=dislen[v]+arclen[v][w];                    sp[w].clear();                    sp[w].push_back(v);                }                else if(dislen[v]+arclen[v][w]==dislen[w])                {                    sp[w].push_back(v);                }            }        }    }}void dfsSP(int u,int timecnt,int discnt){    temps.push_back(u);    if(u==s)    {        if(discnt<distancex||(distancex==discnt&&mintime>timecnt))        {            mintime=timecnt;            anss.clear();            anss=temps;            distancex=discnt;        }    }    for(auto it=sp[u].begin();it!=sp[u].end();++it)    {        dfsSP(*it,timecnt+arctim[*it][u],discnt+arclen[*it][u]);    }    temps.pop_back();}void FastPath(){    int min,v;    for(int i=0;i<n;++i)    {        min=INF;        for(int k=0;k<n;++k)        {            if(vistim[k]==0&&distim[k]<min)            {                min=distim[k];                v=k;            }        }        vistim[v]=1;        for(int w=0;w<n;++w)        {            if(arctim[v][w]<INF&&vistim[w]==0)            {                if(distim[v]+arctim[v][w]<distim[w])                {                    distim[w]=distim[v]+arctim[v][w];                    fp[w].clear();                    fp[w].push_back(v);                }                else if(distim[v]+arctim[v][w]==distim[w])                {                    fp[w].push_back(v);                }            }        }    }}void dfsFP(int u,int secnt,int timcnt){    tempf.push_back(u);    if(u==s)    {        if(secnt<minsec)        {            minsec=secnt;            ansf.clear();            ansf=tempf;            time=timcnt;        }    }    for(auto it=fp[u].begin();it!=fp[u].end();++it)    {        dfsFP(*it,secnt+1,timcnt+arctim[*it][u]);    }    tempf.pop_back();}int main(){    scanf("%d %d",&n,&m);    InitAdjMatrix();    for(int i=0;i<m;++i)    {        int v1,v2,one,len,tim;        scanf("%d %d %d %d %d",&v1,&v2,&one,&len,&tim);        arclen[v1][v2]=len;        arctim[v1][v2]=tim;        if(one==0)        {            arclen[v2][v1]=arclen[v1][v2];            arctim[v2][v1]=arctim[v1][v2];        }    }    scanf("%d %d",&s,&e);    InitDisArray();    ShortPath();    dfsSP(e,0,0);    FastPath();    dfsFP(e,1,0);    if(anss==ansf)    {        printf("Distance = %d; Time = %d: ",distancex,time);        for(auto it=anss.rbegin();it!=anss.rend();++it)            it!=anss.rend()-1?printf("%d -> ",*it):printf("%d\n",*it);        return 0;    }    printf("Distance = %d: ",distancex);    for(auto it=anss.rbegin();it!=anss.rend();++it)        it!=anss.rend()-1?printf("%d -> ",*it):printf("%d\n",*it);    printf("Time = %d: ",time);    for(auto it=ansf.rbegin();it!=ansf.rend();++it)        it!=ansf.rend()-1?printf("%d -> ",*it):printf("%d\n",*it);    return 0;}

直接dfs最后一个测试点是会超时的(毕竟有五百个点)
如下面这个代码:

#include <cstdio>#include <vector>using namespace std;const int maxv=502;int arclen[maxv][maxv],arctim[maxv][maxv];int minsec=0x7fffffff,mintime=0x7fffffff,mintimeOfminlen=0x7fffffff,minlen=0x7fffffff;int s,e,viss[maxv],visf[maxv],vis[maxv];vector<int> anss,ansf,p;vector<int> v[maxv];void dfs(int u,int vcnt,int timecnt,int lencnt){    vis[u]=1;    p.push_back(u);    if(u==e)    {        if(lencnt<minlen||(lencnt==minlen&&timecnt<mintimeOfminlen))        {            minlen=lencnt;            mintimeOfminlen=timecnt;            anss.clear();            anss=p;        }        if(timecnt<mintime||(timecnt==mintime&&vcnt<minsec))        {            mintime=timecnt;            minsec=vcnt;            ansf.clear();            ansf=p;        }    }    for(auto it=v[u].begin();it!=v[u].end();++it)    {        if(vis[*it]==0)        {            dfs(*it,vcnt+1,timecnt+arctim[u][*it],lencnt+arclen[u][*it]);        }    }    vis[p.back()]=0;    p.pop_back();}int main(){    int n,m;    scanf("%d %d",&n,&m);    for(int i=0;i<m;++i)    {        int v1,v2,one,len,tim;        scanf("%d %d %d %d %d",&v1,&v2,&one,&len,&tim);        v[v1].push_back(v2);        arclen[v1][v2]=len;        arctim[v1][v2]=tim;        if(one==0)        {            arclen[v2][v1]=arclen[v1][v2];            arctim[v2][v1]=arctim[v1][v2];            v[v2].push_back(v1);        }    }    scanf("%d %d",&s,&e);    dfs(s,1,0,0);    if(anss==ansf)    {        printf("Distance = %d; Time = %d: ",minlen,mintime);        for(auto it=anss.begin();it!=anss.end();++it)            it!=anss.end()-1?printf("%d -> ",*it):printf("%d\n",*it);        return 0;    }    printf("Distance = %d: ",minlen);    for(auto it=anss.begin();it!=anss.end();++it)        it!=anss.end()-1?printf("%d -> ",*it):printf("%d\n",*it);    printf("Time = %d: ",mintime);    for(auto it=ansf.begin();it!=ansf.end();++it)        it!=ansf.end()-1?printf("%d -> ",*it):printf("%d\n",*it);    return 0;}
0 0
原创粉丝点击