标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2435 Accepted Submission(s): 864
图上最多有5000*2条边,每条边是双向的,那么就是5000*2*2了,然后最多500个p点,p点两两相连、 也就500*500*2条边了。那么图上加起来建5000*4+500000条边就可以了。 但是WA了,改成5000*4+1500000就A了,我也不知道为什么。。。难道我读题错误?。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <queue> 7 #include <cmath> 8 using namespace std; 9 10 #define N 5005 11 #define inf 999999999 12 13 int max(int x,int y){return x>y?x:y;} 14 int min(int x,int y){return x<y?x:y;} 15 int abs(int x,int y){return x<0?-x:x;} 16 17 char map[N][N]; 18 int dis[N]; 19 bool visited[N]; 20 21 struct Edge{ 22 int u, v, w, next; 23 }a[N*4+1500000]; 24 25 26 int cnt; 27 int head[N]; 28 int p[505]; 29 int n, m, cost; 30 31 void setEdge(int u,int v,int w){ 32 a[cnt].u=u;a[cnt].v=v;a[cnt].w=w; 33 a[cnt].next=head[u];head[u]=cnt++; 34 } 35 36 37 void spfa(int st){ 38 queue<int>Q; 39 int i, j, k; 40 memset(visited,false,sizeof(visited)); 41 for(i=0;i<n*m;i++) dis[i]=inf; 42 dis[st]=0; 43 visited[st]=true; 44 Q.push(st); 45 int u, v; 46 while(!Q.empty()){ 47 u=Q.front();Q.pop();visited[u]=false; 48 for(i=head[u];i!=-1;i=a[i].next){ 49 if(dis[a[i].v]>dis[u]+a[i].w){ 50 dis[a[i].v]=dis[u]+a[i].w; 51 if(!visited[a[i].v]){ 52 Q.push(a[i].v); 53 visited[a[i].v]=true; 54 } 55 } 56 } 57 } 58 } 59 60 main() 61 { 62 int i, j, k; 63 while(scanf("%d %d %d",&n,&m,&cost)==3){ 64 for(i=0;i<n;i++) scanf("%s",map[i]); 65 memset(head,-1,sizeof(head)); 66 int cnt=0; 67 int st, end; 68 k=0; 69 for(i=0;i<n;i++){ 70 for(j=0;j<m;j++){ 71 if(map[i][j]==‘#‘) continue; 72 if(map[i][j]==‘Y‘) st=i*m+j; 73 else if(map[i][j]==‘C‘) end=i*m+j; 74 else if(map[i][j]==‘P‘) p[k++]=i*m+j; 75 if(i<n-1&&map[i+1][j]!=‘#‘){ 76 if(map[i+1][j]==‘*‘){ 77 setEdge(i*m+j,(i+1)*m+j,cost); 78 if(map[i][j]==‘*‘){ 79 setEdge((i+1)*m+j,i*m+j,cost); 80 } 81 else{ 82 setEdge((i+1)*m+j,i*m+j,0); 83 } 84 } 85 else { 86 setEdge(i*m+j,(i+1)*m+j,0); 87 if(map[i][j]==‘*‘){ 88 setEdge((i+1)*m+j,i*m+j,cost); 89 } 90 else{ 91 setEdge((i+1)*m+j,i*m+j,0); 92 } 93 } 94 } 95 if(j<m-1&&map[i][j+1]!=‘#‘){ 96 if(map[i][j+1]==‘*‘){ 97 setEdge(i*m+j,i*m+j+1,cost); 98 if(map[i][j]==‘*‘){ 99 setEdge(i*m+j+1,i*m+j,cost); 100 } 101 else{ 102 setEdge(i*m+j+1,i*m+j,0); 103 } 104 } 105 else { 106 setEdge(i*m+j,i*m+j+1,0); 107 if(map[i][j]==‘*‘){ 108 setEdge(i*m+j+1,i*m+j,cost); 109 } 110 else{ 111 setEdge(i*m+j+1,i*m+j,0); 112 } 113 } 114 } 115 } 116 } 117 for(i=0;i<k;i++){ 118 for(j=i+1;j<k;j++){ 119 setEdge(p[i],p[j],0); 120 setEdge(p[j],p[i],0); 121 } 122 } 123 spfa(st); 124 if(dis[end]==inf) printf("Damn teoy!\n"); 125 else printf("%d\n",dis[end]); 126 } 127 }
标签:
原文地址:http://www.cnblogs.com/qq1012662902/p/4379488.html