码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder 1038

时间:2017-05-05 18:31:17      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:blank   span   scanf   bsp   using   abs   evel   log   ace   

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

标签:blank   span   scanf   bsp   using   abs   evel   log   ace   

原文地址:http://www.cnblogs.com/Tree-dream/p/6814104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!