栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3160 Father Christmas fly...

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3160 Father Christmas fly...

#include<cstdio>#include<vector>#include<stack>#include<algorithm>using namespace std;int low[30000],num[30000],comfort[30000],total[30000],ans[30000],counter,set[30000],sn,n,m,in[30000],max_ans;vector<int> group[30000],arc[30000],reverse_arc[30000];bool visited[30000],instack[30000];stack<int> connect,start;void tarjan(int u){    int i,v;    connect.push(u);    instack[u]=true;    visited[u]=true;    low[u]=num[u]=++counter;    for(i=0;i<arc[u].size();i++)    {        v=arc[u][i];        if(!visited[v])        { tarjan(v); if(low[u]>low[v])     low[u]=low[v];        }        else if(instack[v] && low[u]>num[v]) low[u]=num[v];    }    if(num[u]==low[u])    {        total[sn]=0;        do        { v=connect.top(); connect.pop(); set[v]=sn; group[sn].push_back(v); instack[v]=false; if(comfort[v]>0)     total[sn]+=comfort[v];        }while(u!=v);        ans[sn]=total[sn];        sn++;    }}void backtrace(int u)//on condiction of indegree[u]==0{    int i,v;    for(i=0;i<reverse_arc[u].size();i++)    {        v=reverse_arc[u][i];        if(ans[v]<ans[u]+total[v]) ans[v]=ans[u]+total[v];        in[v]--;        if(in[v]==0) start.push(v);    }    if(max_ans<ans[u])        max_ans=ans[u];}int main(){    int i,u,v;    while(~scanf("%d%d",&n,&m))    {        for(i=0;i<n;i++)        { visited[i]=false; instack[i]=false; scanf("%d",&comfort[i]);        }        for(i=0;i<m;i++)        { scanf("%d%d",&u,&v); arc[u].push_back(v);        }        counter=sn=0;        for(i=0;i<n;i++)        { if(!visited[i])     tarjan(i);        }        //reverse_arc        for(i=0;i<sn;i++) in[i]=0;        for(u=0;u<n;u++)        { for(i=0;i<arc[u].size();i++) {     v=arc[u][i];     if(set[v]!=set[u] && find(reverse_arc[set[v]].begin(),reverse_arc[set[v]].end(),set[u])==reverse_arc[set[v]].end())     {         reverse_arc[set[v]].push_back(set[u]);         in[set[u]]++;     } }        }        for(i=0;i<sn;i++)        { if(in[i]==0)     start.push(i);        }        max_ans=0;        while(!start.empty())        { u=start.top(); start.pop(); backtrace(u);        }        for(i=0;i<sn;i++)        { reverse_arc[i].clear(); group[i].clear();        }        for(i=0;i<n;i++) arc[i].clear();        printf("%dn",max_ans);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371314.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号