题意
有n个城市,分属两个阵营,两个阵营用1和2表示。第一个城市属于1号阵营,第二个城市属于2号阵营。有一个商人,想要回家,起点为1号城市,终点为2号城市,问这个商人从起点到终点,最少要花费多少时间。(注意:商人只有一次机会从1号阵营的城市前往2号阵营的城市,或者从2号阵营的城市前往1号阵营的城市)
代码
#include <iostream>
#include <bits/stdc++.h>
#define M 1000
#define INF 999999999
using namespace std;
int n,m,dis[M],mapp[M][M],c[M];
bool visit[M];
//初始化map
void init(){
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
mapp[i][j]=INF;
mapp[i][i]=0;
}
}
}
void dijkstra(){
int minn,flag=1;
for(int i=1;i<=n;i++){
dis[i]=mapp[1][i];
}
memset(visit,false,sizeof(visit));
dis[1]=0;
int num=0;
for(int i=1;i<=n;i++){
minn=INF;
for(int j=1;j<=n;j++){
if(!visit[j]&&dis[j]<minn){
minn=dis[j];
flag=j;
}
}
visit[flag]=true;
for(int j=1;j<=n;j++){
if(!visit[j]&&mapp[flag][j]+dis[flag]<dis[j])
dis[j]=mapp[flag][j]+dis[flag];
}
}
}
int main()
{
int A,B,T;
while(cin>>n){
if(n==0)
break;
init();
cin>>m;
while(m--){
cin>>A>>B>>T;
if(mapp[A][B]>T)
mapp[A][B]=mapp[B][A]=T;
}
for(int i=1;i<=n;i++)
cin>>c[i];
//因为要从城市1到城市2,也就是阵营1到阵营2
//且跨营走的机会自由只有一次
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(c[i]!=c[j]){
if(c[i]==1&&c[j]==2)
mapp[j][i]=INF;
else if(c[i]==2&&c[j]==1)
mapp[i][j]=INF;
}
}
}
dijkstra();
if(dis[2]<INF)
cout<<dis[2]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}