syhd142  
日历
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567
统计
  • 随笔 - 23
  • 文章 - 122
  • 评论 - 31
  • 引用 - 0

导航

常用链接

留言簿(2)

随笔档案(23)

文章分类(270)

文章档案(122)

我的豆瓣

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
题意:给定一系列任务的依赖关系以及完成每个任务需要花费的时间,问一些任务的最晚完成时间和最早完成时间差值。
解法:根据依赖关系建立正反两个图,分别表示该任务动工之前需要完成哪些任务和哪些任务需要在该任务完成之后开始动工,然后两次dfs,分别标记任务,
然后剩下的没有标记的任务的就是完成时间就是所需要求的答案(具体见代码)。
#include <stdio.h>
#include 
<string.h>

#define N 505

bool g[N][N], gb[N][N], mk1[N], mk2[N];
int v[N];

void dfs1(int u, int n)
{
    mk1[u] 
= 1;
    
for(int i = 1; i <= n; i++)
        
if(!mk1[i] && g[u][i])
            dfs1(i, n);
}

void dfs2(int u, int n)
{
    mk2[u] 
= 1;
    
for(int i = 1; i <= n; i++)
        
if(!mk2[i] && gb[u][i])
            dfs2(i, n);
}

int main()
{
    
int n, m, a, b, cas = 1;
    
while(scanf("%d %d"&n, &m), n + m)
    {
        memset(g, 
0sizeof(g));
        memset(gb, 
0sizeof(gb));
        
        
for(int i = 1; i <= n; i++)
            scanf(
"%d"&v[i]);
        
        
for(int i = 0; i < m; i++)
        {
            scanf(
"%d %d"&a, &b);
            g[a][b] 
= 1;
            gb[b][a] 
= 1;
        }
        scanf(
"%d"&m);
        printf(
"Case #%d:\n", cas++);
        
for(int i = 0; i < m; i++)
        {
            scanf(
"%d"&a);
            memset(mk1, 
0sizeof(mk1));
            memset(mk2, 
0sizeof(mk2));
            dfs1(a, n);
            dfs2(a, n);
            
int count = 0;
            
for(int j = 1; j <= n; j++)
            {
                
if(!mk1[j] && !mk2[j])
                {
                    count 
+= v[j];
                }
            }
            printf(
"%d\n", count);
        }
        puts(
"");
    }
    
return 0;
}
posted on 2010-07-24 16:48 Fucker 阅读(286) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPC图论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Fucker Powered by: 博客园 模板提供:沪江博客