拓扑排序模板--hdu2647

来源:互联网 发布:c 编程游戏写法 编辑:程序博客网 时间:2024/06/15 18:52

模板:

#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;}/*65 25 04 04 12 33 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;}
原创粉丝点击