会员
周边
众包
新闻
博问
闪存
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
c语言源码
POJ 3160 Father Christmas flymouse
很简单的一道题,先tarjan缩点,然后SPFA求最长路。
#include<cstdio> #include<string.h> #include<math.h> #include<queue> #define N 30100 #define M 150100 using namespace std; struct edge{ int v,next; }edge[M]; int n,m; int num[N]; int cnt,head1[N],head2[N]; int scc,index,dfn[N],low[N],belong[N],sum[N]; int top,sstack[N]; bool instack[N],vis[N]; int d[N],dis[N],res; void addedge(int u,int v,int *head) { edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } int MAX(int a,int b){ return a>b?a:b; } int MIN(int a,int b){ return a>b?b:a; } void tarjan(int u) { dfn[u]=low[u]=++index; sstack[++top]=u; instack[u]=true; for(int j=head1[u];j!=-1;j=edge[j].next) { int v=edge[j].v; if(dfn[v]==0) { tarjan(v); low[u]=MIN(low[v],low[u]); } else if(instack[v]) { low[u]=MIN(low[u],dfn[v]); } } if(dfn[u]==low[u]) { scc++; while(1) { int tmp=sstack[top--]; instack[tmp]=false; belong[tmp]=scc; sum[scc]+=num[tmp]; if(tmp==u) break; } } } void SPFA(int u){ int i; queue<int>que; que.push(u); dis[u]=sum[u],vis[u]=1; res=max(res,dis[u]); while(!que.empty()){ int tem=que.front(); que.pop(); for(i=head2[tem];i!=-1;i=edge[i].next){ int v=edge[i].v; if(dis[v]<dis[tem]+sum[v]){ dis[v]=dis[tem]+sum[v]; res=max(res,dis[v]); if(!vis[v]){ vis[v]=1; que.push(v); } } } vis[tem]=0; } } void make_graph(){ int i,j; for(i=1;i<=n;i++){ for(j=head1[i];j!=-1;j=edge[j].next){ int v=edge[j].v; if(belong[i]!=belong[v]){ addedge(belong[i],belong[v],head2); d[belong[v]]++; } } } } int main(){ int i; while(scanf("%d %d",&n,&m)==2){ memset(head1,-1,sizeof(head1));cnt=0; memset(head2,-1,sizeof(head2)); memset(sum,0,sizeof(sum)); memset(dfn,0,sizeof(dfn)); memset(instack,0,sizeof(instack));top=0; for(i=1;i<=n;i++){ scanf("%d",&num[i]); if(num[i]<=0) num[i]=0; } for(i=1;i<=m;i++){ int u,v; scanf("%d %d",&u,&v); u++,v++; addedge(u,v,head1); } scc=0; for(i=1;i<=n;i++) if(!dfn[i]) tarjan(i); // 强连通tarjan的模板 memset(d,0,sizeof(d)); make_graph(); memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); res=0; for(i=1;i<=scc;i++) if(!d[i]){ memset(vis,0,sizeof(vis)); SPFA(i); } printf("%d\n",res); } }
posted on
2012-02-16 22:08
c语言源码
阅读(
136
) 评论(
0
)
编辑
收藏
举报
刷新页面
返回顶部
导航
博客园
首页
新随笔
联系
订阅
管理
公告