题解 | #I Wanna Go Home#

I Wanna Go Home

https://www.nowcoder.com/practice/0160bab3ce5d4ae0bb99dc605601e971

#include <queue>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=1000;
const int MAX=10000;
struct edge{
    int to;
    int length;
    edge(int a,int b):to(a),length(b){};
};
struct city{
    int number;
    int dis;
    int leader;
    city(int number,int dis,int leader):number(number),dis(dis),leader(leader){};
    bool operator<(city y) const{
        return dis>y.dis;
    }
};
vector<edge> G[maxn];
priority_queue<city> q;
int dist[maxn];
int lead[maxn];
void init(){
    for(int i=0;i<maxn;i++){
        G[i].clear();
        lead[i]=0;
        dist[i]=MAX;
    }
    while(!q.empty()) q.pop();
}
bool IfCanPass(int x,int y){
    if(lead[x]==lead[y]) return true;
    else if(lead[x]==1 && lead[y]==2) return true;
    else return false;
}
int main(){
    int n;
    while(cin>>n && n!=0){
        init();
        int m;
        cin>>m;
        for(int i=0;i<m;i++){
            int a,b,c;
            cin>>a>>b>>c;
            G[a].push_back(edge(b,c));
            G[b].push_back(edge(a,c));
        }
        for(int i=1;i<=n;i++){
            int ld;
            cin>>ld;
            lead[i]=ld;
        }
        q.push(city(1,0,1));
        dist[1]=0;
        while(!q.empty()){
            city tem=q.top();
            q.pop();
            for(int i=0;i<G[tem.number].size();i++){
                edge t=G[tem.number][i];
                if(dist[t.to]>dist[tem.number]+t.length &&
                IfCanPass(tem.number, t.to)){
                    dist[t.to]=dist[tem.number]+t.length;
                    q.push(city(t.to,dist[t.to],lead[t.to]));
                }
            }
        }
        if(dist[2]==MAX) cout<<"-1"<<endl;
        else cout<<dist[2]<<endl;


    }
}

全部评论

相关推荐

兄弟们,实习都是在接各种api,该怎么包装简历
仁者伍敌:感觉我自己做小项目也是各种api啊,我要怎么包装简历
点赞 评论 收藏
分享
本2硕9,秋招不想努力海投了
小何和:行情再不好也不可能拒绝你,不可能只要双9的
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务