题目:
思路:用vector存储信息发送关系,用dfs判断是否死锁,用ti表示每个进程执行到第几个指令,如果当前进程的信息与前一个指向它的进程为收发关系,一个发送,一个接收,则返回上一个进程继续判断。如果当前进程指向的是搜索过的进程且不是相邻进程,则发生死锁。
提交后100分的代码:
#include <bits/stdc++.h>
#include <sstream>
using namespace std;
const int maxn = 2e4;
struct node {
int v,f;
node(int a,int b) : v(a),f(b){}
};
vector <node> g[maxn];
bool vis[maxn];
int ti[maxn];
bool flag;
void dfs(int u) {
int v;
while(ti[u] < g[u].size() && !flag) {
v = g[u][ti[u]].v;
if(u == v) {
flag = 1;return;
}
if(vis[v]) {
if(ti[v] < g[v].size() && g[v][ti[v]].v == u && g[v][ti[v]].f == -g[u][ti[u]].f) {
ti[u]++;
}
else {
flag = 1;
}
return;
}
else {
vis[v] = 1;
if(ti[v] < g[v].size())
dfs(v);
else {
flag = 1;
}
vis[v] = 0;
ti[u]++;
}
}
}
int main() {
int T,n;
ios::sync_with_stdio(0);
cin >> T >> n;
cin.get();
while(T--) {
for(int i = 0; i < n; i++) {
g[i].clear();
}
memset(ti,0,sizeof(ti));
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++) {
string s;
getline(cin,s);
stringstream ss(s);
string e;
while(ss >> e) {
int v = 0 , t = 1;
while(t < e.length()) {
v = v*10 + e[t] - '0';
t++;
}
if(e[0] == 'S') {
g[i].push_back(node(v,1));
}
else {
g[i].push_back(node(v,-1));
}
}
}
flag = 0;
for(int i = 0; i < n; i++) {
if(ti[i] < g[i].size()) {
dfs(i);
if(flag) {
break;
}
}
}
if(!flag)cout << 0 << "\n";
else cout << 1 << "\n";
}
return 0;
}