第一次CODE Dijkstra
有點冗長 尚有進步空間
#include<stdio.h> #include<stdlib.h> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define min(x,y) (((x)>(y)) ? (y):(x)) #define max(x,y) (((x)>(y)) ? (x):(y)) using namespace std; #define LL long long int LL _INF=100000*100000; class Edge { public: int a,b; LL w; Edge(){} void Print()const { printf("[%d--%d %I64d]\n",a,b,w); } }; bool operator<(Edge e1,Edge e2) { if(e1.a<e2.a) return true; else if(e1.a==e2.a) return (e1.b<e1.b); return false; } bool operator>(Edge e1,Edge e2) { return e1.w>e2.w; } Edge newEdge(int a,int b,LL w) { Edge RE;RE.a=a;RE.b=b;RE.w=w; return RE; } priority_queue<Edge,deque<Edge>,greater<Edge> >Heap; vector<Edge>edges; int BgTab[1010]; int EdTab[1010]; LL Table[1010]; void BuildTable() { sort(edges.begin(),edges.end()); for(int lx=0;lx<edges.size();lx++) { if(BgTab[edges[lx].a]==-1) BgTab[edges[lx].a]=lx; EdTab[edges[lx].a]=lx; //edges[lx].Print(); } } void insert(int a) { if(BgTab[a]<0) return; for(int lx=BgTab[a];lx<=EdTab[a];lx++) { if(Table[edges[lx].b]<_INF) continue; Edge nn=edges[lx]; nn.w+=Table[a]; Heap.push(nn); } } int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) { edges.clear(); while(Heap.size()) Heap.pop(); for(int lx=1;lx<=n;lx++) { Table[lx]=_INF; BgTab[lx]=-1; } int Start,End;scanf("%d %d",&Start,&End); for(int lx=0;lx<m;lx++) { int a,b; LL w; scanf("%d %d %I64d",&a,&b,&w); if(a==b) continue; edges.push_back(newEdge(a,b,w)); edges.push_back(newEdge(b,a,w)); } BuildTable(); Table[Start]=0; insert(Start); //printf("Prc:\n"); while(Heap.size()>0) { if(Table[End]<_INF) break; Edge out=Heap.top(); Heap.pop(); //printf("Do on:\n"); //out.Print(); if(Table[out.b]<_INF) continue; Table[out.b]=out.w; insert(out.b); } if(Table[End]==_INF) printf("He is very hot\n"); else printf("%I64d\n",Table[End]); } return 0; }
沒有留言:
張貼留言