hdu 5154 3342 拓扑排序判环

http://acm.hdu.edu.cn/showproblem.php?pid=3342

http://acm.hdu.edu.cn/showproblem.php?pid=5154

就是拓扑排序判断是否有环,有环就输出NO,没有就输出YES。

拓扑排序判环,用队列实现的话就是看出现在队列中的元素是否跟顶点数相同,如果不同的话肯定是存在环的,因为如果最后只剩下环,那么并不存在一个入度为0的点。

还有一点特别重要的就是一定要初始化!!!!!!!!对入度数组,以及vector进行初始化!!!!!!又白白贡献一次WA

hdu 5514 :

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define M 10009
int in[M];
vector<int> G[M];
int n,m;
bool toposort()
{
    queue<int> q;
    int j = n;
    for(int i = 1;i <= n;i++)
    {
        if(!in[i])
            q.push(i);
    }
    while(!q.empty())
    {
        int cur = q.front();
        q.pop();
        j--;
        for(int i = 0;i < G[cur].size();i++)
        {
            in[G[cur][i]]--;
            if(in[G[cur][i]]==0)
            q.push(G[cur][i]);
        }
    }
    if(j>0) return false;
    return true;
}
int main()
{
    while(scanf("%d %d",&n,&m)==2)
    {
        memset(in,0,sizeof(in));
        for(int i = 1;i <= n;i++)
            G[i].clear();
        for(int i = 0;i < m;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);  //b before a
            in[a]++;
            G[b].push_back(a);
        }
        bool ok = toposort();
        if(ok) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


hdu 3342:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define M 1000
int in[M];
vector<int> G[M];
int n,m;
bool toposort()
{
    queue<int> q;
    int j = n;
    for(int i = 0;i < n;i++)
    {
        if(!in[i]) q.push(i);
    }
    while(!q.empty())
    {
        int t = q.front();
        q.pop();
        j--;
        for(int i = 0;i < G[t].size();i++)
        {
            in[G[t][i]]--;
            if(in[G[t][i]]==0)
                q.push(G[t][i]);
        }
    }
    if(j > 0) return false;
    return true;
}
int main()
{
    while(cin >> n >> m && n)
    {
        memset(in,0,sizeof(in));
        for(int i = 0;i < n;i++)
            G[i].clear();
        for(int i = 0;i < m;i++)
        {
            int a,b;
            cin >> a >> b;
            in[b]++;
            G[a].push_back(b);
        }
        bool ok = toposort();
        if(ok) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值