poj3249【拓扑排序】
2016-04-24 22:01
204 查看
//题意: 给出一个有向无环图,每个顶点都有一个权值。
// 求一条从入度为0的顶点到出度为0的顶点的一条路径,
// 路径上所有顶点权值和最大。
//我觉得只要明白
//图论里的链式前向星 的 建图原理 和 拓扑排序的一点知识就完全有能力打出来
//以后还是可以练练手的 所以写一发吧
//拓扑排序+优化一下
//author keyboarder
//time 2016/4/23 21:52
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#include <queue>
#include <stack>
using namespace std;
#define INF 0x3f3f3f
#define pi acos(-1.0)
#define LL long long
#define mm 1000000007
#define N 1000010
struct asd{
int to;
int next;
};
asd q
;
int head
,tol;
int pre
;
int out
;
int val
;
int dp
;
int n,m;
void add(int a,int b)
{
q[tol].to=b;
q[tol].next=head[a];
head[a]=tol++;
}
void tuopu()
{
queue<int>e;
while(!e.empty())
e.pop();
for(int i=1;i<=n;i++)
{
if(pre[i]==0)
{
pre[i]=-1;
e.push(i);
}
}
while(!e.empty())
{
int u=e.front();
e.pop();
for(int v=head[u];v!=-1;v=q[v].next)
{
int i=q[v].to;
dp[i]=max(dp[u]+val[i],dp[i]);
pre[i]--;
if(pre[i]==0)
{
pre[i]=-1;
e.push(i);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
int u,v;
tol=0;
memset(head,-1,sizeof(head));
memset(pre,0,sizeof(pre));
memset(out,0,sizeof(out));
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
pre[v]++;
out[u]++;
}
for(int i=1;i<=n;i++)
{
if(pre[i]==0)
{
dp[i]=val[i];
}
else
dp[i]=-INF;
}
tuopu();
int ans=-INF;
for(int i=1;i<=n;i++)
{
if(out[i]==0)
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}
// 求一条从入度为0的顶点到出度为0的顶点的一条路径,
// 路径上所有顶点权值和最大。
//我觉得只要明白
//图论里的链式前向星 的 建图原理 和 拓扑排序的一点知识就完全有能力打出来
//以后还是可以练练手的 所以写一发吧
//拓扑排序+优化一下
//author keyboarder
//time 2016/4/23 21:52
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#include <queue>
#include <stack>
using namespace std;
#define INF 0x3f3f3f
#define pi acos(-1.0)
#define LL long long
#define mm 1000000007
#define N 1000010
struct asd{
int to;
int next;
};
asd q
;
int head
,tol;
int pre
;
int out
;
int val
;
int dp
;
int n,m;
void add(int a,int b)
{
q[tol].to=b;
q[tol].next=head[a];
head[a]=tol++;
}
void tuopu()
{
queue<int>e;
while(!e.empty())
e.pop();
for(int i=1;i<=n;i++)
{
if(pre[i]==0)
{
pre[i]=-1;
e.push(i);
}
}
while(!e.empty())
{
int u=e.front();
e.pop();
for(int v=head[u];v!=-1;v=q[v].next)
{
int i=q[v].to;
dp[i]=max(dp[u]+val[i],dp[i]);
pre[i]--;
if(pre[i]==0)
{
pre[i]=-1;
e.push(i);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
int u,v;
tol=0;
memset(head,-1,sizeof(head));
memset(pre,0,sizeof(pre));
memset(out,0,sizeof(out));
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
pre[v]++;
out[u]++;
}
for(int i=1;i<=n;i++)
{
if(pre[i]==0)
{
dp[i]=val[i];
}
else
dp[i]=-INF;
}
tuopu();
int ans=-INF;
for(int i=1;i<=n;i++)
{
if(out[i]==0)
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- JAVA字符串格式化-String.format()的使用
- 关于IGMP协议的知识点汇总
- flex Spark和Halo(mx)
- 练习24:代码巩固练习
- C语言指针实现循环报数问题(简单约瑟夫环问题)
- 结构化思维(Structured Thinking)
- jQuery中.bind() .live() .delegate() .on()的区别
- 腾讯云服务器完美解决无法使用公网IP访问的问题
- 站立会议(6)
- 20145321 《Java程序设计》第8周学习总结
- django 使用内建过滤器实现文章摘要效果
- 20145206邹京儒《Java程序设计》第8周学习总结
- URAL 1841|Cableways|...
- 第二章节总结
- 使用Memcached、Spring AOP构建数据库前端缓存框架
- SSH搭建开发环境
- 助教日志_【沈阳航空航天大学软件工程 1,2,3,4 班】黄金点排行榜
- java字符串的替换replace、replaceAll、replaceFirst的区别详解
- 【转】MySQL 5.6 for Windows 解压缩版配置安装
- Linux系统安装