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 }
时间: 2024-10-21 07:42:57