【noip2012】 文化之旅 floyd

将不能到达的路封了,由于n小跑个floyd就可以了。

 

 

//noip2012 文化之旅
//by dadatu
#include
#include
#define INF 0x3f3f3f3f
using namespace std;

int c[1010],dist[1010][1010],f[1010][1010];
int n,m,k,beginn,endd;

int main()
{
	scanf("%d%d%d%d%d",&n,&k,&m,&beginn,&endd);
	for (int i=1;i<=n;i++) scanf("%d",&c[i]);
	for (int i=1;i<=k;i++)
		for (int j=1;j<=k;j++) scanf("%d",&f[i][j]);
	for (int i=1;i<=m;i++)
	{
		int x,y,d;
		scanf("%d%d%d",&x,&y,&d);
		dist[x][y]=dist[y][x]=d;
	}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		{
			if (i==j||!dist[i][j]) dist[i][j]=INF;
			if (f[c[j]][c[i]]||c[i]==c[j]) dist[i][j]=INF+1;//j文化对i文化排斥表示i不能到j,INF+1表示封路了
		}
	for (int k=1;k<=n;k++)
		for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++)
				 if(dist[i][j]!=INF+1) dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
	printf("%d\n",(dist[beginn][endd]==INF||dist[beginn][endd]==INF+1)?-1:dist[beginn][endd]);
/*	
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++) cout<

 

 

 

 

 

你可能感兴趣的:(图论-floyd,NOIP)