模板:
#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1005; //最大边数
int n; //点数
vector<int> edge[maxn]; //邻接表
queue<int> q; //维护一个入度为0的集合
int indegree[maxn]; //记录每个顶点的入度
void init()
{
for(int i=0; i<n; i++)
edge[i].clear();
memset(indegree, 0, sizeof(indegree));
}
void addedge(int from, int to)
{
edge[from].push_back(to);
indegree[to]++;
}
bool topological_sort()
{
for(int i=0; i<n; i++)
if(indegree[i] == 0)
q.push(i); //将所有入度为0的顶点入队
int cnt = 0; //记录当前已经输出的顶点数
while(!q.empty())
{
int v = q.front();
q.pop();
cout << v << " "; //输出该顶点
cnt++;
for(unsigned int i=0; i<edge[v].size(); i++)
{
int to = edge[v][i]; // 将所有v指向的顶点的入度减1,并将入度减为0的顶点入栈
indegree[to]--;
if(!indegree[to])
q.push(to);
}
}
if(cnt < n)
return false; //有回路
else
return true;
}
int main()
{
init();
scanf("%d",&n);
for(int i=0; i<n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
addedge(a,b);
}
if(!topological_sort())
cout << "-1" << endl;
return 0;
}
/*
6
5 2
5 0
4 0
4 1
2 3
3 1
*/
hdu2647题意:
有n个人,m个关系,a,b代表a应得的工资比b多,最低工资888,,要让所有人满意,求老板最少给多少工资。不可能完成输出-1。
/*
By : ZHangFY
*/
#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 20005; //最大边数
int n; //点数
vector<int> edge[maxn]; //邻接表
queue<int> q; //维护一个入度为0的集合
int indegree[maxn]; //记录每个顶点的入度
int reward[maxn]; //记录每个点应得的钱
void init()
{
for(int i=0; i<n; i++)
edge[i].clear();
memset(indegree, 0, sizeof(indegree));
memset(reward, 0, sizeof(reward));
}
void addedge(int from, int to)
{
edge[from].push_back(to);
indegree[to]++;
}
void topological_sort()
{
for(int i=0; i<n; i++)
if(indegree[i] == 0)
q.push(i);
int money = 888;
int cnt = 0;
while(!q.empty())
{
while(!q.empty())
{
int v = q.front();
q.pop();
reward[v] = money;
cnt++;
for(unsigned int j=0; j<edge[v].size(); j++)
indegree[ edge[v][j] ]--;
}
money++;
for(int i=0; i<n; i++)
{
if(indegree[i] == 0 && reward[i] == 0)
q.push(i);
}
}
if(cnt == n)
{
long long ans = 0;
for(int i=0; i<n; i++)
ans += reward[i];
cout << ans << endl;
}
else
cout << "-1" << endl;
}
int main()
{
int m;
while(scanf("%d%d",&n,&m) != EOF)
{
init();
for(int i=0; i<m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
addedge(b-1,a-1); //注意这里
}
topological_sort();
}
return 0;
}