zoukankan      html  css  js  c++  java
  • hihocoder 1038

    http://hihocoder.com/problemset/problem/1138

    题意:有一些岛屿,要从第一个岛屿到第N个岛屿,求最短距离,距离为min(x,y),也就是两个点的X的差值和Y的差值的较小的。

    思路:最开始我觉得应该dijstrak可以解决,因为是LEVEL1的,结果超时了,我就想是不是head+dijstrak。。结果是的,不过这个题可以用SPFA做

    优化的部分也就是说对于每一个点,拓展4个边就可以,就是x差值最小的两个点,和y差值最小的两个点。

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <iostream>
      4 #include <math.h>
      5 #include <queue>
      6 #include <stdlib.h>
      7 using namespace std;
      8 #define maxn 1000005
      9 #define inf 0x3f3f3f3f
     10 
     11 struct Node{
     12     int x,y;
     13     int id;
     14 }de[maxn];
     15 int n,pos;
     16 int head[maxn],dist[maxn];
     17 bool vis[maxn];
     18 
     19 int cmp(const void *a,const void *b)
     20 {
     21     return (*(Node *)a).x-(*(Node *)b).x;
     22 }
     23 int cmp2(const void *a,const void *b)
     24 {
     25     return (*(Node *)a).y - (*(Node * )b).y;
     26 }
     27 
     28 int abs(int a,int b)
     29 {
     30     if(a>b)
     31         return a-b;
     32     return b-a;
     33 }
     34 int min(int a,int b)
     35 {
     36     return a>b?b:a;
     37 }
     38 
     39 struct note {
     40     int v,w,next;
     41 }edge[maxn];
     42 
     43 void init()
     44 {
     45     pos = 1;
     46     memset( dist , inf , sizeof( dist ) );
     47     memset( head , -1 , sizeof( head ) );
     48     memset( vis , false ,sizeof( vis ) );
     49 }
     50 
     51 
     52 void add(int x,int v,int w)    //这是用数组来构建的一个邻接表。不懂可以在纸上模拟一次就行。
     53 {
     54     edge[ pos ].v = v;
     55     edge[ pos ].w = w;
     56     edge[ pos ].next = head[ x ];
     57     head[ x ] = pos++;
     58 }
     59 
     60 void spfa()     //标准的spfa模板。如果可能有负权回路的话,那就加个num数组来判断。
     61 {
     62     queue<int >s;
     63     s.push(1);
     64     vis[ 1 ] = true;
     65     dist[ 1 ] = 0;
     66     while(!s.empty())
     67     {
     68         int tmp = s.front();
     69         s.pop();
     70         vis [ tmp ] = false;
     71         for( int i = head[ tmp ] ; i != -1 ; i = edge[ i ].next )
     72         {
     73             if( dist[ edge[ i ].v ] > dist[ tmp ] + edge[ i ].w)
     74             {
     75                 dist[ edge[ i ].v ] = dist[ tmp ] + edge[ i ].w;
     76                 if( !vis[ edge[ i ].v ] )
     77                 {
     78                     s.push( edge[ i ].v );
     79                     vis[ edge[ i ].v ] =true;
     80                 }
     81 
     82             }
     83 
     84         }
     85     }
     86 }
     87 
     88 
     89 
     90 int main()
     91 {
     92     scanf("%d",&n);
     93     init();
     94     for(int i = 1;i<=n;i++)
     95         scanf("%d%d",&de[i].x,&de[i].y),de[i].id = i;
     96     qsort(de+1,n,sizeof(de[0]),cmp);
     97     for(int i = 1;i<=n;i++)
     98     {
     99         add(de[i].id,de[i+1].id,min(abs(de[i].x,de[i+1].x),abs(de[i].y,de[i+1].y)));
    100         add(de[i+1].id,de[i].id,min(abs(de[i].x,de[i+1].x),abs(de[i].y,de[i+1].y)));
    101     }
    102     qsort(de+1,n,sizeof(de[0]),cmp2);
    103     for(int i = 1;i<=n;i++)
    104     {
    105         add(de[i].id,de[i+1].id,min(abs(de[i].x,de[i+1].x),abs(de[i].y,de[i+1].y)));
    106         add(de[i+1].id,de[i].id,min(abs(de[i].x,de[i+1].x),abs(de[i].y,de[i+1].y)));
    107     }
    108     spfa();
    109     printf("%d
    ",dist[n]);
    110     return 0;
    111 }
  • 相关阅读:
    BZOJ3790 : 神奇项链
    BZOJ3630 : [JLOI2014]镜面通道
    BZOJ3738 : [Ontak2013]Kapitał
    个人总结
    mac 下的 top 命令
    去掉Xcode源码末尾的空格
    让UILabel的文字顶部对齐
    使用RBTool自动提交code review请求
    不要在init和dealloc函数中使用accessor
    将textField编辑完内容作为参数发送请求
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/6814104.html
Copyright © 2011-2022 走看看