拓扑排序模板
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");
}