大佬不在家,性感代码好寂寞,深夜代码求条!!!
  • 板块学术版
  • 楼主BK小鹿
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/14 22:47
  • 上次更新2024/7/15 08:55:43
查看原帖
大佬不在家,性感代码好寂寞,深夜代码求条!!!
1345783
BK小鹿楼主2024/7/14 22:47

题目

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int N = 5005, M = N * N;

int n, k, a, b, c, cnt;
int g[N][N];
int h[10000005], w[10000005], e[100000005], ne[100000005], idx, num[105][105][105];
int dis[N], st[N];
queue<int> q;

void add(int a, int b, int c)
{
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

bool check(int x, int y)
{
	if (x <= n && x >= 1 && y >= 1 && y <= n)  return true;
	else return false;
}

void spfa(int u)
{
	memset(dis,0x3f,sizeof(dis));
	dis[u]=0;
	st[u]=1;
	q.push(u);
	while (!q.empty())
	{
		int t=q.front();
		q.pop();
		st[t]=0;
		for (int i=h[t];~i;i=ne[i])
		{
			int j=e[i];
			if (dis[j]>dis[t]+w[i])
			{
				dis[j]=dis[t]+w[i];
				if (!st[j])
				{
					q.push(j);
					st[j]=1;
				}
			}
		}
	}
}

int main()
{
	memset(h, -1, sizeof h);
	scanf("%d%d%d%d%d", &n, &k, &a, &b, &c);
	for (int i = 1; i <= n; i ++ )
	  for (int j = 1; j <= n; j ++ )
	    scanf("%d", &g[i][j]);
	
	for (int p = 0; p <= k; p ++ )
	  for (int i = 1; i <= n; i ++ )
	    for (int j = 1; j <= n; j ++ )
	      num[i][j][p] =  ++ cnt;
	
	for (int i = 1; i <= n; i ++ )
	  for (int j = 1; j <= n; j ++ )
	  {
	  	if (check(i + 1, j))  add(num[i][j][0], num[i + 1][j][1], 0);
	  	if (check(i, j + 1))  add(num[i][j][0], num[i][j + 1][1], 0);
	  	if (check(i - 1, j))  add(num[i][j][0], num[i - 1][j][1], b);
		if (check(i, j - 1))  add(num[i][j][0], num[i][j - 1][1], b); 
	  	
	  }
	
	for (int kk = 1; kk < k; kk ++ )
	  for (int i = 1; i <= n; i ++ )
	    for (int j = 1; j <= n; j ++ )
	      if (!g[i][j])
	      {
	      	if (check(i + 1, j))  add(num[i][j][kk], num[i + 1][j][kk + 1], 0);
	      	if (check(i, j + 1))  add(num[i][j][kk], num[i][j + 1][kk + 1], 0);
	      	if (check(i - 1, j))  add(num[i][j][kk], num[i - 1][j][kk + 1], b);
	      	if (check(i, j - 1))  add(num[i][j][kk], num[i][j - 1][kk + 1], b);
	      	add(num[i][j][kk], num[i][j][0], a + c);
	      }
	      else add(num[i][j][kk], num[i][j][0], a);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    if(!g[i][j])  add(num[i][j][k],num[i][j][0],c+a);  
    else  add(num[i][j][k],num[i][j][0],a);
      
    spfa(num[1][1][0]);
    int ans=2147483647;
    for(int i=0;i<=k;i++)ans=min(ans,dis[num[n][n][i]]); 
    printf("%d\n",ans);
} 
2024/7/14 22:47
加载中...