2013年12月14日 星期六

TIOJ 1290 F.不定向邊

[Dijkstra]
第一次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;
}

沒有留言:

張貼留言