您的位置:首页 > 其它

hdu 2647 Reward (拓扑排序)

2012-10-07 16:08 411 查看
/*比较明显的拓扑排序。具体看注释*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define N 10001
using namespace std;
int n,m,x,y,tsum,indx,flag;
struct Node
{
int in;//入度
int sum;//该点获得的奖金
int next;//后续节点数
vector<int> work;//储存后续节点下标
}worker
;
void init()
{
for(int i=1;i<=n;i++)
{
worker[i].sum=888;
worker[i].in=0;
worker[i].next=0;
worker[i].work.clear();
}
tsum=0;
}
bool topsort()
{
while(true)
{
flag=0;
for(int j=1;j<=n;j++)
{
if(worker[j].in>0)
{
flag=1;
}
else if(worker[j].in==0)
{
worker[j].in--;
tsum+=worker[j].sum;//当该点入度为0时,该点的奖金就是最小能得到的合理奖励
for(int k=0;k<worker[j].next;k++)//更新该点的后续节点
{
indx=worker[j].work.at(k);
worker[indx].in--;
if(worker[indx].sum<worker[j].sum+1)
worker[indx].sum=worker[j].sum+1;
}
break;//不要忘记了。。因为每更新点后 。都要从头来一遍
}
if(j==n)
{
if(flag)
return false;
else
return true;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
while(m--)
{
scanf("%d%d",&x,&y);
worker[y].next++;
worker[y].work.push_back(x);
worker[x].in++;
}
if(topsort())
{
printf("%d\n",tsum);
}
else
printf("-1\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: