92pts求助
查看原帖
92pts求助
963247
Slient_QwQ楼主2023/7/21 15:48

rt,#10 超时了

#include <bits/stdc++.h>
using namespace std;
const int N = 233;
int s, t, cnt = 0x3f3f3f3f;
struct Node{
	int id, data;
};
vector<Node> edge[N];
int c[N], tra[N], sum;
bool pc[N][N], vis[N], late[N], flag;
bool check(int v)
{
	for (int i = 1; i <= sum; i++)if (pc[v][tra[i]])return 0;
	return 1;
}
void dfs(int u, int ans)
{
	if (ans >= cnt)return;
	if (u == t)
	{
		cnt = ans;
		return;
	}
	vis[u] = 1;
	tra[++sum] = c[u];
	late[c[u]] = 1;
	for (int i = 0; i < edge[u].size(); i++)
	{
		int v = edge[u][i].id, w = edge[u][i].data;
		if (!vis[v] && !late[c[v]] && check(c[v]))
			dfs(v, ans + w);
	}
	vis[u] = 0;
	tra[++sum] = -1;
	late[c[u]] = 0;
}
int read()
{
	int ans = 0, w = 1; char s = getchar();
	for (; s < '0' || s > '9'; s = getchar())if (s == '-')w = -w;
	for (; s >= '0' && s <= '9'; s = getchar())ans = (ans << 3) + (ans << 1) + s - '0';
	return ans * w;
}
int main()
{
	int n, k, m, i, j, u, v, w;
	n = read(); k = read(); m = read(); s = read(); t = read();
	for (i = 1; i <= n; i++)c[i] = read();
	for (i = 1; i <= k; i++)
		for (j = 1; j <= k; j++)
			pc[i][j] = read();
	for (i = 1; i <= m; i++)
	{
		u = read(); v = read(); w = read();
		Node now;
		now.id = v; now.data = w;
		if (!pc[c[v]][c[u]])edge[u].push_back(now);
		now.id = u; now.data = w;
		if (!pc[c[u]][c[v]])edge[v].push_back(now);
	}
	dfs(s, 0);
	if (cnt == 0x3f3f3f3f)cnt = -1;
    cout << cnt;
//	getchar(); getchar();
	return 0;
}
2023/7/21 15:48
加载中...