题目 洛谷拓扑排序模板题
附注释版代码学习
#include<bits/stdc++.h>
using namespace std;
struct ty{
int y;
int next;
}edge[500];
int head[500],n;
int k=0;
int ins[500]={0};
void in (int x,int z) //插入数据
{
k=k+1;
edge[k].y=z; //记录终点
edge[k].next=head[x]; //记录起点能到达的上一个终点
head[x]=k; //更新起点能到的上一个终点
}
void topu() //拓扑排序
{
int i;
queue<int>q;
for(i=1;i<=n;i++)
{
if (ins[i]==0) //如果没有入度则入队列
q.push(i);
}
while(q.size())
{
int x=q.front();
q.pop();
// sum++;
cout<<x<<" ";
for(i=head[x];i!=-1;i=edge[i].next)//查看其终点,减边,如果入度变为0则入队
{
ins[edge[i].y]--;
if (ins[edge[i].y]==0)
{
q.push(edge[i].y);
}
}
}
}
int main ()
{
//int n;
cin>>n;
int i,t;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++)
{
cin>>t;
while(t!=0)
{
ins[t]++; //记录入度数量
in(i,t);
cin>>t;
}
}
topu();
return 0;
}
加权版拓扑排序题目 练习
附上代码,本题采用vector来存储表,上题采用链式向前
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long t[10009];
vector <int>q[10029];
int vis[10020];
long long su[10020];
long long ans=0;
int main ()
{
cin>>n>>m;
int i,x,y;
for(i=1;i<=n;i++)
cin>>t[i];
for(i=1;i<=m;i++)
{
cin>>x>>y;
q[x].push_back(y);
vis[y]++;
}
queue<int>k;
for(i=1;i<=n;i++)
{
if (vis[i]==0)
{
su[i]=t[i];
k.push(i);
}
}
while(k.size())
{
int x=k.front();
k.pop();
for(i=0;i<q[x].size();i++)
{
int v=q[x][i];
vis[v]--;
su[v]=max(su[v],t[v]+su[x]);
if (vis[v]==0)
k.push(v);
}
}
for(i=1;i<=n;i++)
ans=max(ans,su[i]);
cout<<ans<<endl;
return 0;
}