拓扑排序模板--hdu2647

模板:

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn = 1005; //最大边数

int n;  //点数
vector<int> edge[maxn]; //邻接表
queue<int> q;  //维护一个入度为0的集合
int indegree[maxn]; //记录每个顶点的入度

void init()
{
    for(int i=0; i<n; i++)
        edge[i].clear();
    memset(indegree, 0, sizeof(indegree));
}
void addedge(int from, int to)
{
    edge[from].push_back(to);
    indegree[to]++;
}
bool topological_sort()
{
    for(int i=0; i<n; i++)
        if(indegree[i] == 0)
            q.push(i);  //将所有入度为0的顶点入队
    int cnt = 0;       //记录当前已经输出的顶点数

    while(!q.empty())
    {
        int v = q.front();
        q.pop();

        cout << v << " "; //输出该顶点
        cnt++;
        for(unsigned int i=0; i<edge[v].size(); i++)
        {
            int to = edge[v][i]; // 将所有v指向的顶点的入度减1,并将入度减为0的顶点入栈
            indegree[to]--;
            if(!indegree[to])
                q.push(to);
        }
    }
    if(cnt < n)
        return false;  //有回路
    else
        return true;
}
int main()
{
    init();
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        addedge(a,b);
    }
    if(!topological_sort())
        cout << "-1" << endl;

    return 0;
}
/*
6
5 2
5 0
4 0
4 1
2 3
3 1
*/

hdu2647题意:
有n个人,m个关系,a,b代表a应得的工资比b多,最低工资888,,要让所有人满意,求老板最少给多少工资。不可能完成输出-1。

/*
By : ZHangFY
*/
#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn = 20005; //最大边数

int n;  //点数
vector<int> edge[maxn]; //邻接表
queue<int> q;  //维护一个入度为0的集合
int indegree[maxn]; //记录每个顶点的入度
int reward[maxn];  //记录每个点应得的钱

void init()
{
    for(int i=0; i<n; i++)
        edge[i].clear();
    memset(indegree, 0, sizeof(indegree));
    memset(reward, 0, sizeof(reward));
}
void addedge(int from, int to)
{
    edge[from].push_back(to);
    indegree[to]++;
}
void topological_sort()
{
    for(int i=0; i<n; i++)
        if(indegree[i] == 0)
            q.push(i);

    int money = 888;

    int cnt = 0;
    while(!q.empty())
    {
        while(!q.empty())
        {
            int v = q.front();
            q.pop();
            reward[v] = money;
            cnt++;
            for(unsigned int j=0; j<edge[v].size(); j++)
                indegree[ edge[v][j] ]--;
        }
        money++;
        for(int i=0; i<n; i++)
        {
            if(indegree[i] == 0 && reward[i] == 0)
                q.push(i);
        }
    }
    if(cnt == n)
    {
        long long ans = 0;
        for(int i=0; i<n; i++)
            ans += reward[i];
        cout << ans << endl;
    }
    else
        cout << "-1" << endl;
}
int main()
{
    int m;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        init();
        for(int i=0; i<m; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            addedge(b-1,a-1); //注意这里
        }
        topological_sort();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值