HDU 5961 传递 BFS

**题意:**中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 **思路:**分别BFS判深度即可,用这种方法注意要进行读入优化。
/** @Date    : 2016-11-18-20.00
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version :
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <utility>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <stack>
#include <queue>
//#include<bits/stdc++.h>
#define LL long long
#define pii pair<int ,int>
#define mp(x,y) make_pair((x), (y))
#define fi first
#define se second
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5+2000;



vector<int >ed1[2100], ed2[2100];
int vis[2100];

int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);

for(int i = 1; i <= n; i++)
ed1[i].clear(), ed2[i].clear();

getchar();
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
char t;
t = getchar();//读入优化
if(t == 'P')
ed1[i].push_back(j);
else if(t =='Q')
ed2[i].push_back(j);
}
getchar();
}

int flag = 0;
for(int i = 1; i <= n; i++)
{
queue<int>q;
q.push(i);
MMF(vis);
while(!q.empty())
{
int nw = q.front();
q.pop();
for(int j = 0; j < ed1[nw].size(); j++)
{
int nl = ed1[nw][j];
if(vis[nl] == 0)//第二层的新点,表明第一层不能到达 直接退出
{
vis[nl] = vis[nw] + 1;
if(nw != i || vis[nl] >= 2)
{
flag = 1;
break;
}
q.push(nl);
}
}
if(flag)
break;
}
while(!q.empty())
q.pop();
MMF(vis);
q.push(i);
while(!q.empty())
{
int nw = q.front();
q.pop();
for(int j = 0; j < ed2[nw].size(); j++)
{
int nl = ed2[nw][j];
if(vis[nl] == 0)
{
vis[nl] = vis[nw] + 1;
if(nw != i || vis[nl] >= 2)
{
flag = 1;
break;
}
q.push(nl);
}
}
if(flag)
break;
}
}
if(flag)
puts("N");
else puts("T");

}
return 0;
}
原文地址:https://www.cnblogs.com/Yumesenya/p/6086738.html