• 计蒜客 2017复赛 百度地图导航


     

    dijstra + 堆优化 + 反向优先队列

    这道题的建图很重要,感觉很厉害

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include<vector>
     5 #include<stack>
     6 #include<set>
     7 #include<iostream>
     8 #include<algorithm>
     9 using namespace std;
    10 
    11 struct node
    12 {
    13     int k;
    14     long long w;
    15 };
    16 priority_queue<node>Q;
    17 bool operator < ( const node & d1, const node & d2 )  { return d1.w > d2.w; }
    18 vector<vector<node> >G;
    19 bool vis[60001];
    20 
    21 
    22 void dij(int s,int t)
    23 {
    24     memset(vis,false,sizeof(vis));
    25     node tempnode;
    26     tempnode.k = s;
    27     tempnode.w = 0;
    28     Q.push(tempnode);
    29     while(!Q.empty())
    30     {
    31         tempnode = Q.top(); Q.pop();
    32         vis[tempnode.k] = true;
    33         if(tempnode.k == t)
    34         {
    35             printf("%lld",tempnode.w);
    36             return;
    37         }
    38         for(int i=0,j=G[tempnode.k].size();i<j;i++)
    39         {
    40             node nexnode; nexnode.k = G[tempnode.k][i].k;
    41             if(vis[nexnode.k]) continue;
    42             nexnode.w = tempnode.w + G[tempnode.k][i].w;
    43             Q.push(nexnode);
    44         }
    45     }
    46     printf("-1");
    47 }
    48 
    49 int main()
    50 {
    51     int n,m;
    52     node tempnode;
    53     scanf("%d%d",&n,&m);
    54     G.resize(n+m*2+1);
    55     int cnt = n+1;
    56     for(int i=1;i<=m;i++)
    57     {
    58         int k,ki;
    59         scanf("%d",&k);
    60         for(int j=0;j<k;j++)
    61         {
    62             scanf("%d",&ki);
    63             tempnode.k = n+(i<<1)-1;
    64             tempnode.w = 0;
    65             G[ki].push_back(tempnode);
    66             tempnode.k = ki;
    67             G[n+(i<<1)].push_back(tempnode);
    68         }
    69     }
    70     int m1; scanf("%d",&m1);
    71     int a,b,c;
    72     for(int i=0;i<m1;i++)
    73     {
    74         scanf("%d%d%d",&a,&b,&c);
    75         tempnode.k = b;
    76         tempnode.w = c;
    77         G[a].push_back(tempnode);
    78         tempnode.k = a;
    79         G[b].push_back(tempnode);
    80     }
    81     int m2; cin>>m2;
    82     for(int i=0;i<m2;i++)
    83     {
    84         scanf("%d%d%d",&a,&b,&c);
    85         tempnode.k = (b<<1)+n;
    86         tempnode.w = c;
    87         G[(a<<1)+n-1].push_back(tempnode);
    88         tempnode.k = (a<<1)+n;
    89         G[(b<<1)+n-1].push_back(tempnode);
    90     }
    91     int s,t;
    92     cin>>s>>t;
    93     dij(s,t);
    94     return 0;
    95 }
  • 相关阅读:
    使用MulticastSocket实现多点广播(实现多人聊天室)
    双目相机标定以及立体测距原理及OpenCV实现
    opencv5-objdetect之级联分类器
    OpenCV人脸识别--detectMultiScale函数
    简单eclipse配置opencv的方法
    Struts2之Action的配置
    Struts2入门
    用户管理系统网站框架改进之MVC模式
    Tomcat中设置数据源和连接池
    JSP第一个实例之用户管理系统
  • 原文地址:https://www.cnblogs.com/liwenchi/p/8589656.html
Copyright © 2020-2023  润新知