• [BZOJ2834]回家的路


    Description

    Input

    Output

    Sample Input

    2 1
    1 2
    1 1 2 2

    Sample Output

    5
     
    思路还是很简单的,然而最短路打错各种对拍各种调了一早上
    代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<vector>
     5 #include<queue>
     6 #include<cstdlib>
     7 #include<map>
     8 #include<algorithm>
     9 #define M 300010
    10 using namespace std;
    11 vector<int>S1[M],S2[M];
    12 map<int,int>f[M];
    13 int n,m,num,cnt,x1,x2,y1,y2;
    14 int head[M],dis[M],vis[M],st[M],v[M];
    15 struct point{int to,next,dis;}e[M<<1];
    16 void add(int from,int to,int dis) {
    17     e[++num].next=head[from];
    18     e[num].to=to;
    19     e[num].dis=dis;
    20     head[from]=num;
    21 }
    22 void SPFA(int s) {
    23     memset(dis,63,sizeof(dis));
    24     queue<int>Q;dis[s]=0;
    25     Q.push(s);
    26     while(!Q.empty()) {
    27         int x=Q.front();Q.pop();vis[x]=false;
    28         for(int i=head[x];i;i=e[i].next) {
    29             int to=e[i].to;
    30             if(dis[x]+e[i].dis<dis[to]) {
    31                 dis[to]=dis[x]+e[i].dis;
    32                 if(!vis[to]) vis[to]=true,Q.push(to);
    33             }
    34         }
    35     }
    36 }
    37 int get(int x,int y) {
    38     return 2*abs(v[st[x]]-v[st[y]]);
    39 }
    40 bool cmp(int x,int y) {
    41     return v[x]<v[y];
    42 }
    43 int main() {
    44     scanf("%d%d",&n,&m);
    45     for(int i=1;i<=m;i++) {
    46         int x,y;scanf("%d%d",&x,&y);
    47         if(f[x][y]!=0) continue;
    48         f[x][y]=++cnt;
    49         S1[x].push_back(cnt);v[cnt]=y;
    50         S2[y].push_back(++cnt);v[cnt]=x;
    51         add(cnt-1,cnt,1),add(cnt,cnt-1,1);
    52     }
    53     scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    54     if(!f[x1][y1]) {
    55         f[x1][y1]=++cnt;
    56         S1[x1].push_back(cnt);v[cnt]=y1;
    57         S2[y1].push_back(++cnt);v[cnt]=x1;
    58         add(cnt-1,cnt,0),add(cnt,cnt-1,0);
    59     }
    60     else {
    61         int t=f[x1][y1];
    62         add(t+1,t,0),add(t,t+1,0);
    63     }
    64     if(!f[x2][y2]) {
    65         f[x2][y2]=++cnt;
    66         S1[x2].push_back(cnt);v[cnt]=y2;
    67         S2[y2].push_back(++cnt);v[cnt]=x2;
    68         add(cnt-1,cnt,0),add(cnt,cnt-1,0);
    69     }
    70     else {
    71         int t=f[x2][y2];
    72         add(t+1,t,0),add(t,t+1,0);
    73     }
    74     for(int i=1;i<=(n<<1);i++) {
    75         int tmp=0;
    76         for(int j=0;j<S1[i].size();j++) st[++tmp]=S1[i][j];
    77         if(tmp>1) {
    78             sort(st+1,st+tmp+1,cmp);
    79             for(int j=2;j<=tmp;j++) {
    80                 add(st[j-1],st[j],get(j-1,j));
    81                 add(st[j],st[j-1],get(j,j-1));
    82             }
    83         }
    84         tmp=0;
    85         for(int j=0;j<S2[i].size();j++) st[++tmp]=S2[i][j];
    86         if(tmp>1) {
    87             sort(st+1,st+tmp+1,cmp);
    88             for(int j=2;j<=tmp;j++) {
    89                 add(st[j-1],st[j],get(j-1,j));
    90                 add(st[j],st[j-1],get(j,j-1));
    91             }
    92         }
    93     }
    94     int s=f[x1][y1],t=f[x2][y2];
    95     SPFA(s);
    96     printf("%d
    ",dis[t]>1e8?-1:dis[t]);
    97     return 0;
    98 }

    HINT

    N<=20000,M<=100000

  • 相关阅读:
    java2: HttpClient,实现登录,请求等操作,session保持
    bat使用1
    java4: 读取配置文件
    HTML+CSS学习笔记(一)
    第1章:JavaScript简介
    第2章:在HTML中使用JavaScript
    HTML+CSS学习笔记(二)
    ASP.NET防止页面刷新的方法
    上下左右无空隙不间断图片连续滚动代码
    SQL Server2005新加的功能排名函数
  • 原文地址:https://www.cnblogs.com/Slrslr/p/10075021.html
Copyright © 2020-2023  润新知