日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图结构练习——判断给定图是否存在合法拓扑序列

發布時間:2024/8/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图结构练习——判断给定图是否存在合法拓扑序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

給定一個有向圖,判斷該有向圖是否存在一個合法的拓撲序列。

輸入

輸入包含多組,每組格式如下。 第一行包含兩個整數n,m,分別代表該有向圖的頂點數和邊數。(n<=10) 后面m行每行兩個整數a b,表示從a到b有一條有向邊。

輸出

若給定有向圖存在合法拓撲序列,則輸出YES;否則輸出NO。

示例輸入

1 0 2 2 1 2 2 1

示例輸出

YES NO

提示



#include <iostream>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct arcnode//表結點;
{
? ? int adj;
? ? struct arcnode *next;
}arcnode;
typedef struct vnode//頭結點;
{
? ? int data;
? ? arcnode *first;
}adjlist[10];
typedef struct//表結構;
{
? ? adjlist a;
? ? int vn,an;
}ALG;
int n,m,i,j;
int indegree[10];//記錄每個節點的入度;
void create(ALG &g)//建立有向圖的鄰接表;
{
? ? int v1,v2;
? ? arcnode *p;
? ? g.an=m;
? ? g.vn=n;
? ? for(i=1;i<=g.vn;i++)
? ? ? ? g.a[i].first=NULL;//頭結點清空;
? ? for(i=1;i<=g.an;i++)
? ? {
? ? ? ? scanf("%d%d",&v1,&v2);
? ? ? ? p=new arcnode;
? ? ? ? p->adj=v2;
? ? ? ? indegree[v2]++;
? ? ? ? p->next=g.a[v1].first;
? ? ? ? g.a[v1].first=p;
? ? }
}
void topo(ALG &g)//判斷圖是否滿足拓撲排序;
{
? ? int k;
? ? arcnode *p;
? ? stack<int>s;
? ? for(i=1;i<=n;i++)
? ? ? ? if(!indegree[i])//入度為零的結點入棧;
? ? ? ? s.push(i);
? ? int count=0;//記錄出棧元素的個數,最后判斷是否滿足拓撲排序;
? ? while(!s.empty())
? ? {
? ? ? ? j=s.top();
? ? ? ? s.pop();
? ? ? ? count++;//統計棧內有多少個元素;
? ? ? ? for(p=g.a[j].first;p;p=p->next)//刪除所有以j為起點的邊;
? ? ? ? {
? ? ? ? ? ? k=p->adj;
? ? ? ? ? ? if(!(--indegree[k]))//將新入度為零的結點入棧;
? ? ? ? ? ? ? ? s.push(k);
? ? ? ? }
? ? }
? ? if(count<n)//出棧元素少于結點個數,說明存在原圖有環;
? ? ? ? printf("NO\n");
? ? else
? ? printf("YES\n");
}
int main()
{
? ? ALG g;
? ? while(~scanf("%d%d",&n,&m))
? ? {
? ? ? ? memset(indegree,0,sizeof(indegree));//元素出度的初始化;
? ? ? ? create(g);
? ? ? ? topo(g);
? ? }
? ? return 0;
}




#include <iostream>
#include<cstdio>
#include<queue>
using namespace std;
#include<cstring>
#include<algorithm>
int map[20][20],in[15],vis[15];
int main()
{
? ? int n,m;
? ? int i,j,k;
? ? while(cin>>n>>m)
? ? {
? ? ? memset(in,0,sizeof(in));
? ? ? memset(map,0,sizeof(map));
? ? ? memset(vis,0,sizeof(vis));
? ? ? while(m--)
? ? ? {
? ? ? int v,u;
? ? ? cin>>u>>v;
? ? ? if(!map[u][v])
? ? ? ? ? ?in[v]++,map[u][v]=1;
? ? ? }


? ? ? for(k=0;k<n;k++){
? ? ? ?for(i=1;i<=n;i++)
? ? ? ?if(!in[i]&&!vis[i]){
? ? ? ? ?vis[i]=1;
? ? ? ? ?for(j=1;j<=n;j++){
? ? ? ? ?if(map[i][j])
? ? ? ? ? map[i][j]=0,in[j]--;
? ? ? ? ?}
? ? ? ? ?break;
? ? ? ?}
? ? ? ?if(i>n)
? ? ? ? break;
? ? ? }
? ? ? if(k<n){
? ? ? cout<<"NO\n";
? ? ? }
? ? ? else
? ? ? cout<<"YES\n";


? ? }


}

總結

以上是生活随笔為你收集整理的图结构练习——判断给定图是否存在合法拓扑序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。