最短工期之拓扑排序

在这里插入图片描述
拓扑排序模板

    queue<int>q;
    vector<int>edge[n];
    for(int i=0;i<n;i++)  //n  节点的总数
        if(in[i]==0) q.push(i);  //将入度为0的点入队列
    vector<int>ans;   //ans 为拓扑序列
    while(!q.empty())
    {
    
    
        int p=q.front(); q.pop(); // 选一个入度为0的点,出队列
        ans.push_back(p);
        for(int i=0;i<edge[p].size();i++)
        {
    
    
            int y=edge[p][i];
            in[y]--;
            if(in[y]==0)
                q.push(y);  
        }
    }
    if(ans.size()==n)   
    {
    
    
        for(int i=0;i<ans.size();i++)
            printf( "%d ",ans[i] );
        printf("\n");
    }
    else printf("No Answer!\n");   //  ans 中的长度与n不相等,就说明无拓扑序列

本题ac

#include"iostream"
#include"string.h"
#include"stack"
#include"vector"
#include"algorithm"
using namespace std;
typedef struct node
{
    
    
	int to;
	int cost;
}node;
int in[101];
int dis[101];
stack<int>q;
vector<node>t[101];
int cnt = 0;
void topo()
{
    
    
	while (!q.empty())
	{
    
    
		int w = q.top();
		q.pop();
		cnt++;
		for (int i = 0; i < t[w].size(); i++)
		{
    
    
			int to = t[w][i].to;
			int cost = t[w][i].cost;
			in[to]--;
			if (in[to] == 0)
				q.push(to);
			dis[to] = max(dis[to], dis[w] + cost);
		}
}

}
int main()
{
    
    
	int a, b, c;
	memset(dis, 0, sizeof(dis));
	memset(in, 0, size(in));
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
    
    
		cin >> a >> b >> c;
		node k;
		k.cost = c;
		k.to = b;
		t[a].push_back(k);
		in[b]++;
	}
	for (int i = 0; i<n; i++)
	{
    
    
		if (in[i] == 0)
			q.push(i);
	}
	topo();
	int Max = 0;
	for (int i = 0; i < n; i++)
		Max = max(dis[i], Max);
	if (cnt == n)
	{
    
    
		printf("%d\n", Max);
	}
	else
		printf("Impossible\n");
}

猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/114022833