萌新刚学c++,求助水题
  • 板块灌水区
  • 楼主BK小鹿
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/7/13 11:59
  • 上次更新2024/7/13 14:38:13
查看原帖
萌新刚学c++,求助水题
1345783
BK小鹿楼主2024/7/13 11:59

rt,代码卡死没有输出,不知道为啥

题目

Code

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

#define op first
#define kk second
#define PII pair<int, int>
#define re register int

using namespace std;

const int N = 15, M = 102405, K = 155;

int n, m, p, s, nb, tot_n, k;
int layer;
int h[N], e[M], ne[M], w[M], idx;
int num[N][N], cnt, key_num[N];
bool g[N][N], hadkey[N];
PII key[N][N];
bool st[N];
int dis[N];


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

void read()
{
	scanf("%d%d%d%d", &n, &m, &p, &k);
	int x, y, x1, y1, gg, q;
	
	for (re i = 1; i <= n; i ++ )
	  for (re j = 1; j <= m; j ++ )
	    num[i][j] = ++ cnt;
	
	while (k -- )
	{
		scanf("%d%d%d%d%d", &x, &y, &x1, &y1, &gg);
		int u = num[x][y], v = num[x1][y1];
		if (gg >= 1)  g[u][v] = g[v][u] = gg;
		else  g[u][v] = g[v][u] = -1;			
	}
	
	scanf("%d", &s);
	
	for (re i = 1; i <= s; i ++ )
	{
		scanf("%d%d%d", &x, &y, &q);
		key_num[q] ++ ;
		key[q][key_num[q]] = {x, y};
	}
}

void build()
{
	layer = (1 << p), nb = n * m, tot_n = nb * layer;
	
	for (re t = 0; t < layer; t ++ )
	{
		for (re i = 1; i <= k; i ++ )
			if ((1 << i - 1) & t)  hadkey[i] = 1;
			else hadkey[i] = 0;
		
		for (re i = 1; i <= n; i ++ )
		  for (re j = 1; j <= m; j ++ )
		  {
		  	int u = num[i][j], v = num[i][j + 1];
		  	if (!v || g[u][v] == -1)  continue;
		  	if (g[u][v] == 0 || hadkey[g[u][v]])  add(t * nb + u, t * nb + v, 1), add(t * nb + v, t * nb + u, 1);
		  	
		  	v = num[i + 1][j];
		  	if (!v || g[u][v] == -1)  continue;
		  	if (g[u][v] == 0 || hadkey[g[u][v]])  add(t * nb + u, t * nb + v, 1), add(t * nb + v, t * nb + u, 1);
		  }
		  
		  for (int i = 1; i <= p; i ++ )
		    if (!hadkey[i])
		    	for (int j = 1; j <= key_num[i]; j ++ )
		    	{
		    		int u = num[key[i][j].op][key[i][j].kk];
		    		add(t * nb + u, k + (1 << (i - 1)) * nb + u, 0);
		    	}		    
	}
}

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

void solve()
{
	int ans = 0x3f3f3f3f;
    for(int i = 0; i < layer; i ++ )  ans = min(ans, dis[i * nb + num[n][m]]);
    if(ans == 0x3f3f3f3f) printf("-1\n");
    else printf("%d\n",ans);
}

int main()
{
	memset(h, -1, sizeof h);
	read();
	build();
	spfa();
	solve();
	return 0;
}
2024/7/13 11:59
加载中...