POJ|3767 Dijkstra最短路径

经典的最短路径题目,更新的时候加上一个条件即可,不可以从leader为2的地区到leader为1的地区。

#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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容