题目1162:I Wanna Go Home

#include "iostream"
#include "stdio.h"
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <string.h>
#include <stack>
#include <queue>
#include <ctype.h>
#include <functional>
#include <math.h>
using namespace std;
//1162
const int INF=0x7fffffff;
 
struct E{
    int nt,d;
};
vector<E> v[610];
bool mk[610];
int ds[610];
int flag[610];
E tmp;
int n,m,a,b,c,np;
int main(){
    //freopen("input.txt","r",stdin);
    while(cin>>n>>m && n!=0){
        for(int i=1;i<=n;i++){
            v[i].clear();
            mk[i]=false;
            ds[i]=-1;
        }
        while(m--){
            cin>>a>>b>>c;
            tmp.d=c;
            tmp.nt=b;
            v[a].push_back(tmp);
            tmp.nt=a;
            v[b].push_back(tmp);
        }
        for(int i=1;i<=n;i++){
            cin>>flag[i];
        }
        ds[1]=0;
        mk[1]=true; 
        np=1;
        for(int i=0;i<n;i++){        //dijkstra 循环n-1次
            for(int j=0;j<v[np].size();j++){
                int t=v[np][j].nt;
                int c=v[np][j].d;
                if(mk[t])   continue;
                if(flag[np]==2 && flag[t]==1)   continue;   //不从阵营2到阵营1
                if(ds[t]==-1 || ds[np]+c<ds[t] )
                    ds[t]=ds[np]+c;
            }
            int mi=INF;
            for(int j=1;j<=n;j++){
                if(mk[j]||ds[j]==-1)    continue;
                if(ds[j]<mi){
                    mi=ds[j];
                    np=j;
                }
            }
            mk[np]=true;
        }
        cout<<ds[2]<<endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1162
    User: cust123
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:1672 kb
****************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值