Week_10 C

拓扑排序

HDU 2647

题意:输入n行数据a,b  ,表示a的钱数大于b的钱数,最低的人分的的钱数为888,问最少需要多少钱可以分给员工

思路:标准的拓扑排序,不过这题需要逆向拓扑

注意点:1、如何判断途中有换,或者说有的点没有选择到,用个int整型cnt,利用拓扑排序的特点,每个点只查找一次,所以当cnt==n的时候,输出sum。

2、多组输入不要忘了初始化数组之类的

 #include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <vector>
//const int maxn = 1e5+5;
#define ll long long
#define MAX INT_MAX
#define FOR(i,a,b) for( ll i = a;i <= b;++i)
using namespace std;
int n,m,sum,head,headmoney,a,b,cnt;
int degree[];      //度,我就不多说了
vector<int>vec[];    //存此节点下的子节点
queue<int>que;          //存接下来思考的节点
int main()
{
// freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
// freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(degree,,sizeof(degree));
while(!que.empty()) que.pop();
memset(vec,,sizeof(vec));
sum=;
cnt=; while(m--)
{
cin>>a>>b;
if(a!=b)
{
vec[b].push_back(a);
degree[a]++;
} } for(int i=;i<=n;++i)
{
if(degree[i]==)
{
//cnt++;
//sum+=888;
que.push(i);
que.push();
}
}
while(!que.empty())
{
cnt++; head=que.front();
que.pop();
headmoney=que.front();
que.pop();
sum+=headmoney;
for(int i=;i<vec[head].size();++i)
{
if(--degree[vec[head][i]]==)
{
que.push(vec[head][i]);
que.push(headmoney+);
}
}
}
if(cnt==n)
{
cout<<sum<<endl;
}
else cout<<"-1"<<endl; } }
上一篇:Neo4j之坑


下一篇:第一个Python脚本!