Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
RE啊RE啊R了一晚上了#include <stdio.h> #include <memory.h> #include <stdlib.h> #include <string.h> #include <vector> using namespace std; #define MaxN 1048576 #define MaxL 33 #define INF -1 struct HEAPtype { long h2n;/* from Heap number To vertex Number*/ long vop;/* Value Of Priority */ }heap[MaxN]; long n2h[MaxN];/* from vertex Number To Heap number */ long hn;/*the number of Heap Nodes*/ int Better(long ax,long bx)/* which one is better of priority */ { if (ax<bx || (bx==INF && ax!=INF)) return 1; return 0; } int HeapSwap(long ix,long jx) { long temp; long vx,ux; if (ix>hn || jx>hn) return 0; temp=heap[ix].vop; heap[ix].vop=heap[jx].vop; heap[jx].vop=temp; vx=heap[ix].h2n; ux=heap[jx].h2n; temp=n2h[vx]; n2h[vx]=n2h[ux]; n2h[ux]=temp; temp=heap[ix].h2n; heap[ix].h2n=heap[jx].h2n; heap[jx].h2n=temp; return 0; } int Heapfy(long ix) { long jx; if (ix>hn) return 0; /*up adjust*/ jx=0; while (ix/2>=1 && Better(heap[ix].vop,heap[ix/2].vop)) { HeapSwap(ix,ix/2); ix=ix/2; jx=1; } if (jx) return 1; /*else,down adjust*/ jx=ix; do { ix=jx; if (ix*2<=hn && Better(heap[ix*2].vop,heap[ix].vop)) jx=ix*2; if (ix*2+1<=hn && Better(heap[ix*2+1].vop,heap[ix].vop)) jx=ix*2+1; if (ix!=jx) HeapSwap(ix,jx); } while (ix!=jx); return 0; } int Relax(long ix,long wt,long jx) { if (Better(heap[ix].vop+wt,heap[jx].vop)) { heap[jx].vop=heap[ix].vop+wt; Heapfy(jx); } return 0; } typedef struct NODES { long EW,ID; } NODE; vector <struct NODES> al[MaxN]; int t; int nop,nw,l; char op[MaxL][MaxL]; long c[MaxL]; long sv,tv; long dest;/* Shortest Path */ long i,j; long u,v; char bin[MaxN][MaxL]; char temps[MaxL]; int hash[MaxN]; long Convert(char sx[MaxL]) { int ix; long oct=0; for (ix=0;ix<l;ix++) oct=oct*2+sx[ix]-'0'; return oct; } int pos[MaxN]; long Dijkstra() { int ix,jx; int an; NODE tnode; memset(n2h,0,sizeof(n2h)); /* Insert the Node */ hn=1; heap[1].vop=0; heap[1].h2n=sv; n2h[sv]=1; while (hn) { if (heap[1].h2n==tv) return heap[1].vop; /* Take Out the Top Node of Heap */ heap[0].vop=heap[1].vop;/* vop will be used for relaxing*/ u=heap[1].h2n; HeapSwap(1,hn); hn--; Heapfy(1);/* Keep Heaplike */ memset(pos,-1,sizeof(pos)); for (ix=1;hash[u]==0 && ix<=nop;ix++) { strcpy(temps,bin[u]); for (jx=0;jx<l;jx++) { if (op[ix][jx]=='F') temps[jx]=(temps[jx]=='1' ? '0' : '1'); else if (op[ix][jx]=='S') temps[jx]='1'; else if (op[ix][jx]=='C') temps[jx]='0'; } v=Convert(temps); if (v==u) continue; if (bin[v][0]==0) strcpy(bin[v],temps); if (pos[v]>=0 && c[ix]<al[u][pos[v]].EW) al[u][pos[v]].EW=c[ix]; if (pos[v]==-1) { tnode.EW=c[ix]; tnode.ID=v; al[u].push_back(tnode); pos[v]=al[u].size()-1; } } hash[u]=1; an=al[u].size()-1; for (ix=0;ix<=an;ix++) { v=al[u][ix].ID; if (n2h[v]==0) { hn++; if (hn>MaxN-1) return 0; heap[hn].vop=INF; heap[hn].h2n=v; n2h[v]=hn; } Relax(0,al[u][ix].EW,n2h[v]); } } return 0; } int main() { scanf("%d",&t); while (t) { scanf("%d",&l); memset(bin,0,sizeof(bin)); memset(al,0,sizeof(al)); memset(hash,0,sizeof(hash)); scanf("%d%d\n",&nop,&nw); for (i=1;i<=nop;i++) scanf("%s%d",&op[i],&c[i]); for (i=1;i<=nw;i++) { scanf("%s",&temps); sv=Convert(temps); if (bin[sv][0]==0) strcpy(bin[sv],temps); scanf("%s",&temps); tv=Convert(temps); if (bin[tv][0]==0) strcpy(bin[tv],temps); dest=Dijkstra(); if (dest) printf("%ld",dest); else printf("NP"); if (i==nw) printf("\n"); else printf(" "); } t--; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator