题目1162:I Wanna Go Home

来源:互联网 发布:数据分析常用方法 编辑:程序博客网 时间:2024/05/19 15:21
#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;//1162const 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
原创粉丝点击