hihocoder 1038

Posted 一个_小菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",dist[n]);
110     return 0;
111 }

 

以上是关于hihocoder 1038的主要内容,如果未能解决你的问题,请参考以下文章

hihocoder第233周

动态规划:背包问题

PAT乙级1038

ZZNUOJ_C语言1038:绝对值最大(完整代码)

*1038苹果和虫子

PAT乙级1038