ural 1227.Rally Championship

1227图论,
给出一些点和点之间的无向边,问能否找到一条有向路径其长度大于等于指定长度
分析:如果图中有环路,则一定可以(有环路说明可以绕着该环一直走)
或者存在一条长度大于等于指定长度的一条通路。

竟然发现自己不会在图中找环,写了近两个小时都没把这个找环的内容处理好。
还是从网上荡下来一个。
从每个点开始做一遍dfs找到最大若有点回到该点则说明有环路,
要么就dfs出一条最长的通路。

 1#include<cstdio>
 2#include<cstring>
 3using namespace std;
 4#define MN 101
 5int map[MN][MN];
 6int flag[MN];
 7int n,root,cost,f;
 8void dfs(int x,int s)
 9{
10     if(f)
11     return ;
12     if(s>=cost)
13     {
14                f=1;
15                return ;
16     }

17     for(int i=1;i<=n;i++)
18     {
19         if(!flag[i]&&map[x][i])
20         {
21            int tmp=map[x][i];
22            map[x][i]=map[i][x]=0;  //选择了该条边在最长路上 
23            flag[i]=1;
24            if(i==root)  //有环路 
25            {
26                   f=1;
27                   return ;
28            }

29            dfs(i,s+tmp);
30            map[x][i]=map[i][x]=tmp;  //不选择这条边在最长路上 
31            flag[i]=0;
32            if(f)
33            return;
34         }

35     }

36}

37int main()
38{
39    int m,i,a,b,d;
40    while(scanf("%d%d%d",&n,&m,&cost)!=EOF)
41    {
42        memset(flag,0,sizeof(flag));
43        memset(map,0,sizeof(map));
44        f=0;
45        for(i=0;i<m;i++)
46        {
47             scanf("%d%d%d",&a,&b,&d);
48             if(!map[a][b])
49             map[a][b]=map[b][a]=d;
50             else
51             f=1;
52        }

53        for(i=1;i<=n&&!f;i++)
54        {
55            memset(flag,0,sizeof(flag));
56            root=i;
57            dfs(i,0);
58        }

59        if(f)
60        puts("YES");
61        else
62        puts("NO");
63    }

64    return 0;
65}

 

posted on 2010-08-09 14:55 YUANZX 阅读(443) 评论(0)  编辑 收藏 引用


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


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜