图结构练习——判断给定图是否存在合法拓扑序列
題目描述
給定一個有向圖,判斷該有向圖是否存在一個合法的拓?fù)湫蛄小?輸入
輸入包含多組,每組格式如下。 第一行包含兩個整數(shù)n,m,分別代表該有向圖的頂點數(shù)和邊數(shù)。(n<=10) 后面m行每行兩個整數(shù)a b,表示從a到b有一條有向邊。輸出
若給定有向圖存在合法拓?fù)湫蛄?#xff0c;則輸出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//表結(jié)點;
{
? ? int adj;
? ? struct arcnode *next;
}arcnode;
typedef struct vnode//頭結(jié)點;
{
? ? int data;
? ? arcnode *first;
}adjlist[10];
typedef struct//表結(jié)構(gòu);
{
? ? adjlist a;
? ? int vn,an;
}ALG;
int n,m,i,j;
int indegree[10];//記錄每個節(jié)點的入度;
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;//頭結(jié)點清空;
? ? 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)//判斷圖是否滿足拓?fù)渑判?#xff1b;
{
? ? int k;
? ? arcnode *p;
? ? stack<int>s;
? ? for(i=1;i<=n;i++)
? ? ? ? if(!indegree[i])//入度為零的結(jié)點入棧;
? ? ? ? s.push(i);
? ? int count=0;//記錄出棧元素的個數(shù),最后判斷是否滿足拓?fù)渑判?#xff1b;
? ? while(!s.empty())
? ? {
? ? ? ? j=s.top();
? ? ? ? s.pop();
? ? ? ? count++;//統(tǒng)計棧內(nèi)有多少個元素;
? ? ? ? for(p=g.a[j].first;p;p=p->next)//刪除所有以j為起點的邊;
? ? ? ? {
? ? ? ? ? ? k=p->adj;
? ? ? ? ? ? if(!(--indegree[k]))//將新入度為零的結(jié)點入棧;
? ? ? ? ? ? ? ? s.push(k);
? ? ? ? }
? ? }
? ? if(count<n)//出棧元素少于結(jié)點個數(shù),說明存在原圖有環(huá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";
? ? }
}
總結(jié)
以上是生活随笔為你收集整理的图结构练习——判断给定图是否存在合法拓扑序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Amr and Pins
- 下一篇: windows稀疏文件