#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define maxn 10000+5
using namespace std;
typedef struct LNode {
int data;
struct LNode *next;
}*List,LNode;
List LinkList[maxn];
int visit[maxn];
int stack[maxn];
int dfn[maxn];
int low[maxn];
int cnt;
int deep;
int flag;
int sn;
void addNode(List &p,int d_) {
List q=(List)malloc(sizeof(LNode));
q->data = d_;
q->next = p-> next;
p->next = q;
}
void displayNode(List &p) {
List q=(List)malloc(sizeof(LNode));
q = p->next;
while(q!=NULL) {
cout<<q->data<<"->";
q=q->next;
}
}
void DFS(int v) {
List p = LinkList[v]->next;
deep++;
visit[v]=1;
stack[++sn] = v;
dfn[v] = low[v] = deep;
while(p!=NULL) {
int u= p->data;
if(visit[u]==0) {
DFS(u);
low[v]=(low[v]<low[u])?low[v]:low[u];
if(flag) return;
} else
low[v]=(low[v]<dfn[u])?low[v]:dfn[u];
p = p->next;
}
if(low[v]==dfn[v]) {
//表示在栈中的当前点到栈顶的顶组成一个强连通
if(v!=1)
flag=1;
}
}
int main() {
int n,m;//n个房间 m条边
int v,u;
while(scanf("%d%d",&n,&m)>0&&n+m!=0) {
//建立结点
for(int i=1; i<=n; i++) {
LinkList[i] = (List)malloc(sizeof(LNode));
visit[i]=0;//设置未访问
LinkList[i]->next=NULL;//邻接为NULL
}
while(m--) {
scanf("%d%d",&v,&u);
addNode(LinkList[v],u);
}
for(int i=1; i<=n; i++) {
cout<<"NODE "<<i<<"->";
displayNode(LinkList[i]);
cout<<endl;
}
flag=0;
deep = 0;
sn=0;
DFS(1);
if(flag)printf("No\n");
else printf("Yes\n");
}
return 0;
}
邻接表|全联通|hdu 1269
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 出省打电话,你还在交漫游费吗? 出差去外地,只有省内流量的你,有没有买好全国流量? 这些我们日常会遇到的烦恼,对欧...
- 刚刚马云拿下中国联通!全世界沸腾! 今天,马云又完成了三场颠覆,每一场颠覆直击要害,每一场前所未有!联手联通 颠覆...
- 新人初入职场,职场那些“坑”可真坑爹! 1、“好工作就是钱多、事少、离家近。”这个应该就是所有人大家公认的好工作。...
