您的位置:首页 > 编程语言 > Go语言

题目1162:I Wanna Go Home

2017-04-20 09:10 260 查看

#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
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: