ACM UVA-10986

這題用Dijkstra+priority_queue即可解出。queue中可能會有重複的node id,不過無妨,如果拜訪過的話會被pop出來。

//ignore header files
struct Node{
    int id;
    unsigned int dis;
    bool operator<(Node n) const{
        return dis>n.dis;
    }
};
struct Edge{
    int id;
    int w;
};
using namespace std;
int main(int argc, char *argv[])
{
    int c;
    string s;
    vector<int> q;


    while(scanf("%d",&c) != EOF){
        for(int o = 1;o <= c;o++){
            vector<Edge> list[20005];
            unsigned int weight[20005];
            bool visit[20005] = {0};
            int n,m,s,t;
            scanf("%d %d %d %d",&n,&m,&s,&t);
            while(m--){
                int u,v,w;
                Edge uv,vu;
                scanf("%d %d %d",&u,&v,&w);
                //cost
                uv.w = w;
                uv.id = v;
                list[u].push_back(uv);
                vu.w = w;
                vu.id = u;
                list[v].push_back(vu);
            }
            for(int i = 0;i<n;i++){
                weight[i] = 1e9;
            }
            priority_queue<Node> PQ;
            weight[s] = 0;
            //printf("%d\n",s);
            PQ.push((Node){s,weight[s]});
            for(int i = 0;i<n;i++){
                int a = -1;
                while(!PQ.empty() && visit[a = PQ.top().id]){
                    PQ.pop();
                }
                if(a == -1){
                    break;
                }
                PQ.pop();
                visit[a] = true;
                for(size_t j = 0;j<list[a].size();j++){
                    Edge b = list[a][j];
                    if(!visit[b.id] && weight[a]+b.w < weight[b.id]){
                        weight[b.id] = weight[a]+b.w;
                        PQ.push((Node){b.id,weight[b.id]});
                    }
                }
            }

            if(weight[t]<1e9){
                printf("Case #%d: %d\n",o,weight[t]);
            }else{
                printf("Case #%d: unreachable\n",o);
            }
        }

    }
    return 0;
}