POJ3767----I Wanna Go Home

来源:互联网 发布:网络教育本科二学历 编辑:程序博客网 时间:2024/06/07 06:49

题意:有n个城市,分属两个阵营,两个阵营用1和2表示。第一个城市属于1号阵营,第二个城市属于2号阵营。有一个商人,想要回家,起点为1号城市,终点为2号城市,问这个商人从起点到终点,最少要花费多少时间。(注意:商人只有一次机会从1号阵营的城市前往2号阵营的城市,或者从2号阵营的城市前往1号阵营的城市)。

案例:第一行:n个城市

    第二行:m条路线

           给你m条路线,A和B之间有一条路,需要花费T单位时间

    第三行:n个城市分属的阵营


思路:求最少的时间,就是最短路问题。题目中给的路是双向的,在输入的时候需注意。再来就是阵营问题。起点是1号城市,属于1号阵营,终点是2号城市,属于2号阵营,所以从1城市到2城市,必要用掉那一次机会,所以我们可以在输入n个城市的阵营的时候处理下。(具体看代码)


#include <stdio.h>#include <iostream>#include <algorithm>#define M 605#define INF 999999999using namespace std;int n,m,dis[M],map[M][M],i,j,c[M];bool visit[M];void init(){for(i=0;i<M;i++){for(j=0;j<M;j++){map[i][j]=INF;map[i][i]=0;}}}void dijkstra(){int min,flag=1;for(i=1;i<=n;i++)dis[i]=map[1][i];memset(visit,false,sizeof(visit));dis[1]=0;int num=0;for(i=1;i<=n;i++){min=INF;for(j=1;j<=n;j++){if(!visit[j] && dis[j]<min){min=dis[j];flag=j;}}visit[flag]=true;for(j=1;j<=n;j++){if(!visit[j] && map[flag][j]+dis[flag]<dis[j]){dis[j]=map[flag][j]+dis[flag];}}}}int main(){int a,b,t;while(scanf("%d",&n),n){init();scanf("%d",&m);while(m--){scanf("%d%d%d",&a,&b,&t);if(map[a][b]>t)map[a][b]=map[b][a]=t;}for(i=1;i<=n;i++)scanf("%d",&c[i]);//由于要从1城市到2城市,必定是从1阵营到2阵营的,//所以当跨阵营走的时候,那些返回原来阵营的路就可//以定义为无穷,因为机会只有一次。for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(c[i]!=c[j]){if(c[i]==1 && c[j]==2)map[j][i]=INF;else if(c[i]==2 && c[j]==1)map[i][j]=INF;}}}dijkstra();if(dis[2]<INF)printf("%d\n",dis[2]);elseprintf("-1\n");}return 0;}