拓扑排序
http://hihocoder.com/problemset/problem/1175
题目大意:
这是一个病毒传播的问题,建立在一个有向无环图的基础上,每一次传播后一个病毒都会把自身的全部病毒都传给前面,问最终整个图一共有多少病毒。
思路:拓扑排序裸题
代码:
#include<bits/stdc++.h>
using namespace std;
# define maxn 100005
int deg[maxn];
int vir[maxn];
vector<int>wakaka[maxn];
int n,m,k;
queue<int >q;
void topsort()
{
for(int i=1; i<=n; i++)
{
if(!deg[i])
{
q.push(i);
}//如果入度为0,压入栈
}
// while(!q.empty())q.pop();
while(!q.empty())
{
int top=q.front();
q.pop();
int len=wakaka[top].size();
for(int i=0; i<len; i++)
{
if(--deg[wakaka[top][i]]==0)
{
q.push(wakaka[top][i]);
}
vir[wakaka[top][i]]=(vir[wakaka[top][i]]+vir[top])%142857;
}
}
}
int main()
{
cin>>n>>m>>k;
memset(deg,0,sizeof(deg));
memset(vir,0,sizeof(vir));
for(int i=1; i<=n; i++)
{
wakaka[i].clear();
}
for(int i=1; i<=k; i++)
{
int t;
cin>>t;
vir[t]=1;
}
for(int i=1; i<=m; i++)
{
int u,v;
cin>>u>>v;
wakaka[u].push_back(v);
deg[v]++;//记录入度
}
//cout<<1<<endl;
topsort();
int sum=0;
for(int i=1; i<=n; i++)
{
sum=(sum+vir[i])%142857;
}
cout<<sum<<endl;
return 0;
}
题目链接:https://nanti.jisuanke.com/t/16957
题目大意:每一次移动只能按照有向无环图给定的方向进行移动,问你怎样按照标准走才能使得全程的权值最大。
代码:
#include<bits/stdc++.h>
using namespace std;
# define maxn 100005
vector<pair<int,int > >wakaka[maxn];
queue<int >q;
int dp[maxn];
int deg[maxn];
int n,m;
void topsort()
{
for(int i=1; i<=n; i++)
{
if(!deg[i])
{
q.push(i);
}
}
while(!q.empty())
{
int top=q.front();
q.pop();
int len=wakaka[top].size();
for(int i=0; i<len; i++)
{
int t=wakaka[top][i].first;
if(--deg[t]==0)q.push(t);
dp[t]=max(dp[t],dp[top]+wakaka[top][i].second);
}
}
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
memset(deg,0,sizeof(deg));
for(int i=1; i<=n; i++)
{
wakaka[i].clear();
}
while(!q.empty())q.pop();
cin>>n>>m;
for(int i=1;i <=m; i++)
{
int u,w,v;
cin>>u>>w>>v;
wakaka[u].push_back(make_pair(w,v));
deg[w]++;
}
topsort();
int maxx=-1;
for(int i=1; i<=n; i++)
{
if(dp[i]>maxx)
{
maxx=dp[i];
}
}
cout<<maxx<<endl;
}
return 0;
}
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2498.html
代码如下:
#include<bits/stdc++.h>
using namespace std;
# define maxn 50000+10
vector<pair<int,int> >wakaka[maxn];
int deg[maxn];
int dis[maxn];
int path[maxn];
queue<int >q;
int n,m;
void topsort()
{
for(int i=1; i<=n; i++)
{
if(deg[i]==0)
q.push(i);
}
memset(path,0,sizeof(path));
while(!q.empty())
{
int top=q.front();
q.pop();
int len=wakaka[top].size();
for(int i=0; i<len; i++)
{
int temp=wakaka[top][i].first;
if(--deg[temp]==0)
{
q.push(temp);
}
// int s=wakaka[top][i].second;
if((dis[temp]<dis[top]+wakaka[top][i].second)||(dis[temp]==dis[top]+wakaka[top][i].second&&path[temp]>top))//这个地方有一个坑点,在相等的时候需要比较path【temp】和top 的值。
{
dis[temp]=dis[top]+wakaka[top][i].second;
path[temp]=top;
//cout<<path[temp]<<endl;
}
}
}
cout<<dis[1]<<endl;
int t=1;
while(path[t]!=0)
{
cout<<t<<" "<<path[t]<<endl;
t=path[t];
}
}
int main()
{
while(cin>>n>>m)
{
memset(dis,0,sizeof(dis));
for(int i=1; i<=n; i++)
{
wakaka[i].clear();
}
while(!q.empty())q.pop();
for(int i=1; i<=m; i++)
{
int u,v,w;
cin>>u>>v>>w;
wakaka[v].push_back(make_pair(u,w));//反向见图!!!
deg[u]++;
}
topsort();
}
return 0;
}