| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我草什么强连通+拓扑, 我个强连通+欧拉路判断足矣秒杀~~~// 强连通缩点 + 判断欧拉路( 用并查集判断连通性 ) + 输入加速外挂
// G++提交 63MS 无压力 ( 开外挂不要用C++提交 )
// C++提交 297-344MS 有点压力... ( 不开外挂 )
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1001;
struct node {
int a,b;
int nxt;
}e[N*6];
int p[N];
int cnt;
int n,m;
int bin[N];
int find(int r) {
if(r!=bin[r]) return bin[r]=find(bin[r]);
return bin[r];
}
void merge(int x,int y) {
x=find(x); y=find(y);
bin[x]=y;
}
stack<int>s;
int DFN[N];
int low[N];
int belong[N];
bool instack[N];
int num,dep;
int in[N];
int out[N];
bool hash[N][N];
void tarjan(int u) {
DFN[u]=low[u]=dep++;
instack[u]=1;
s.push(u);
int i,v;
for(i=p[u];i!=0;i=e[i].nxt) {
v=e[i].b;
if(DFN[v]==-1)
tarjan(v) , low[u]=min(low[u],low[v]);
else if(instack[v])
low[u]=min(low[u],DFN[v]);
}
if(low[u]==DFN[u]) {
num++;
do {
v=s.top(); s.pop();
belong[v]=num;
instack[v]=0;
}while(v!=u);
}
}
void init() {
memset(DFN,-1,sizeof(DFN));
memset(low,-1,sizeof(low));
memset(instack,0,sizeof(instack));
num=dep=0;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(p,0,sizeof(p));
cnt=0;
}
void addedge(int a,int b) {
e[++cnt].b=b; e[cnt].nxt=p[a]; p[a]=cnt;
}
// 适用于 int (正数) , 输入外挂
inline void readint(int &ret) {
char c;
do { c = getchar();
} while(c < '0' || c > '9');
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
}
int main()
{
int t;
int i,j;
int a,b;
scanf("%d",&t);
while(t--) {
// scanf("%d%d",&n,&m);
readint(n); readint(m);
init();
for(i=1;i<=m;i++) {
//scanf("%d%d",&a,&b);
readint(a); readint(b);
addedge(a,b);
}
for(i=1;i<=n;i++)
if(DFN[i]==-1) tarjan(i);
memset(hash,0,sizeof(hash));
for(i=0;i<=n;i++) bin[i]=i;
// 在新建图中 记录 欧拉路的条件 in入度,out出度,merge()合并两个点
for(i=1;i<=n;i++) {
int u=belong[i];
for(j=p[i];j!=0;j=e[j].nxt) {
int v=belong[e[j].b];
if(u!=v&&!hash[u][v]) {
hash[u][v]=1;
out[u]++; in[v]++;
merge(u,v);
}
}
}
// 判断是否是欧拉路
int ru=0,chu=0,ct=0,mak=0;
for(i=1;i<=num;i++) {
if(bin[i]==i) ct++;
if(in[i]==out[i]) continue;
if(in[i]-out[i]==1) ru++;
else if(out[i]-in[i]==1) chu++;
else {mak=1; break;}
}
if(mak || ct!=1 || ru!=chu || ru>1 || chu>1 ) {
puts("No");
}
else puts("Yes");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator