您的位置:首页 > 其它

HDU3342 - Legal or Not 拓补排序模板

2015-08-26 21:21 225 查看
HDU3342 - Legal or Not :http://acm.hdu.edu.cn/showproblem.php?pid=3342

这题没什么说的了,就是判断是否能进行拓补排序,代码有解释.

代码 :

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 111;
int N,M;
int x,y;
int cnt;
int Map[MAXN][MAXN],In[MAXN];
void Initial()
{
cnt = 0;
memset(Map,0,sizeof(Map));
memset(In,0,sizeof(In));
}
void TopoSort()
{
int i,j,k;
for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
{
if(!In[j])//j的入度为0,将其选出
{
In[j]--,cnt++;//j的入度减一,防止被重复访问
for(k = 0;k < N;k++)//将和j相连的节点入度减一,相当于划去一条边:j -> k,把入度为0的节点单独分出来了
if(Map[j][k])
In[k]--;
break;
}
}
}
if(cnt == N)printf("YES\n");//最后没有入度大于1的节点
else printf("NO\n");
}
int main()
{
while(~scanf("%d%d",&N,&M) && N)
{
Initial();
while(M--)
{
scanf("%d%d",&x,&y);
if(!Map[x][y])//Map[x][y]为1代表有一条x -> y的边
Map[x][y] = 1,In[y]++;//y入度加一
}
TopoSort();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: