POJ|3767 Dijkstra最短路徑

經(jīng)典的最短路徑題目,更新的時候加上一個條件即可,不可以從leader為2的地區(qū)到leader為1的地區(qū)。

#include<iostream>
#include<vector>
#include<queue>
#include<limits.h>
#include<cstring>
using namespace std;

struct Edge{
    int to;
    int len;
    Edge(int t, int l):to(t), len(l){}
};

struct Point{
    int num;
    int dis;
    bool operator < (const Point& p) const{
        return dis > p.dis;
    }
    Point(int n, int d):num(n), dis(d){}
};

const int MAXN = 601;
const int INF = INT_MAX;

vector<Edge> graph[MAXN];
int leader[MAXN];
int dist[MAXN];

void Dijkstra(int s){
    dist[s] = 0;
    priority_queue<Point> q;
    q.push(Point(s, 0));
    while(!q.empty()){
        int u = q.top().num;
        q.pop();
        for(int i = 0; i < graph[u].size(); i++){
            int v = graph[u][i].to;
            if(leader[u] == 2 && leader[v] == 1)
                continue;
            if(dist[v] > dist[u] + graph[u][i].len){
                dist[v] = dist[u]+graph[u][i].len;
                q.push(Point(v, dist[v]));
            }
        }
    }
    return;
}

int main(){
    int n,m;
    while(cin>>n && n){
        fill(dist, dist+MAXN, INF);
        memset(graph, 0, sizeof(graph));
        cin>>m;  // m條路
        while(m--){
            int from,to,l;
            cin>>from>>to>>l;
            graph[from].push_back(Edge(to, l));
            graph[to].push_back(Edge(from, l));
        }
        for(int i = 1; i <= n; i++){
            int l;
            cin>>l;
            leader[i] = l;
        }
        Dijkstra(1);
        if(dist[2] == INF)
            cout<<-1<<endl;
        else
            cout<<dist[2]<<endl;
    }
    return 0;
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容