这个题目的大致思想是:使用迪杰斯特拉算法求最短路径,但是在更新最短路径的时候要判断是否多次穿过两个阵营。
C++代码如下:
#include<stdio.h>
#define max 0x7fffffff
int grah[601][601];
int root[601];
int n;
void dij()
{
int d[601];
bool vis[601]={false};
int i,j,pos=0;
for(i = 0;i < n; i++)
d[i] = grah[0][i];
vis[0] = true ;
for( i= 1; i <= n; i++)
{
int min=max;
for(j = 0; j < n; j++)
{
if( ! vis[j] && min > d[j])
{
min=d[j];
pos = j;
}
}
vis[pos] = true;
for( j = 0;j < n ;j++)
{
if( !vis[j] && grah[pos][j] < max && !(root[pos] == 2 && root[j] == 1))
{
if(d[j] > d[pos]+ grah[pos][j])
d[j] = d[pos] + grah[pos][j];
}
}
}
if(d[1] < max) printf("%d\n",d[1]);
else printf("-1\n");
}
int main()
{
//freop