//輸入端
for(int i=0;i<p;i++)
{
cin >> vec[i].output;
}
//邏輯閘
for(int i=p;i<p+q;i++)
{
cin >> vec[i].gate;
}
// 前點 後點
for(int i=0;i<m;i++)
{
int a, b;
cin >> a >> b;
vec[b-1].from.push_back(a-1);
vec[a-1].to.push_back(b-1);
}
int maxDelay = 0;
for(int i=p;i<p+q;i++)
{
maxDelay = max(maxDelay, dfs(i));
}
cout << maxDelay -1 << endl;
// 輸出端
for (int i=p+q; i<p+q+r; i++)
{
cout << vec[vec[i].from[0]].output << " "; //這是找輸出端前面的邏輯閘運算後的值
}
著重說明輸出的時候是需要往前找的因為我的dfs只有計算邏輯閘,所以要找輸出端前面的邏輯閘運算後的值
這是主要的dfs函式
int dfs(int u) {
// DFS + 記憶化的邏輯可以在這裡寫
if (dp[u] != -1) return dp[u]; //避免重複算
int maxDelay = 0;
for(int pre:vec[u].from)//算延遲 (路徑長度
{
maxDelay = max(maxDelay, dfs(pre));
}
//確保所有from 都已接算好
if(vec[u].gate != -1)
{
if(vec[u].gate == 1) // and
{
vec[u].output = 1;
for(int pre: vec[u].from)
{
if(vec[pre].output == 0)
{
vec[u].output = 0;
break; // 一旦有0就可以停
}
}
}
else if(vec[u].gate == 2) // or
{
vec[u].output = 0;
for(int pre:vec[u].from)
{
if(vec[pre].output == 1)
{
vec[u].output = 1;
}
}
}
else if(vec[u].gate == 3) // xor
{
vec[u].output = 0;
for(int pre:vec[u].from)
{
vec[u].output ^= vec[pre].output;
}
}
else if(vec[u].gate == 4) //not
{
vec[u].output = vec[vec[u].from[0]].output == 0 ? 1 : 0;
}
}
dp[u] = maxDelay + 1; // 自己這層也要 +1 秒
return dp[u];
}