URAL1291. Gear-wheels

本文提供了一道关于图论和分数规划的算法题目解答,通过广度优先搜索(BFS)遍历图结构,并利用分数简化技巧来确定各节点间的分数关系。代码实现了从起点开始对所有可达节点进行初始化和更新分数的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1291

不知道为嘛被分在DP里了 瞎写 注意没被别的轮带动的情况 初始为0  分母为1

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<queue>
 8 using namespace std;
 9 #define N 1010
10 vector<int>ge[N];
11 int co[N],d[N],vis[N];
12 struct node
13 {
14     int f,nu,de;
15 }p[N];
16 int gcd(int a,int b)
17 {
18     return b==0?a:gcd(b,a%b);
19 }
20 void init(int x,int y)
21 {
22     int n1 = co[x]*p[x].nu,n2 = co[y]*p[x].de;
23     if(n1==0||n2==0) n2=1;
24     else
25     {
26         int k = gcd(n1,n2);
27         n1 = n1/k;n2 = n2/k;
28     }
29     if(d[y]==1)
30     p[y].f = 1;
31     else
32     p[y].f = -1;
33     p[y].nu = n1;
34     p[y].de = n2;
35 }
36 void bfs(int u)
37 {
38     queue<int>q;
39     q.push(u);
40     while(!q.empty())
41     {
42         int tu = q.front();
43         q.pop();
44         for(int i = 0 ; i < (int)ge[tu].size() ; i++)
45         {
46             int v = ge[tu][i];
47             if(!vis[v])
48             {
49                 vis[v] = 1;
50                 d[v] = -d[tu];
51                 init(tu,v);
52                 q.push(v);
53             }
54         }
55     }
56 }
57 int main()
58 {
59     int i,n,s,v;
60     scanf("%d",&n);
61     for(i = 1; i <= n ; i++)
62     {
63         scanf("%d",&co[i]);
64         int a;
65         while(scanf("%d",&a)&&a)
66         ge[i].push_back(a);
67     }
68     scanf("%d%d",&s,&v);
69     d[s] = 1;
70     p[s].f = 1;
71     p[s].nu = v;
72     p[s].de = 1;
73     vis[s] = 1;
74     bfs(s);
75     for(i = 1; i <= n ; i++)
76     {
77         if(p[i].f==-1&&p[i].nu)
78         printf("-");
79         if(p[i].nu==0)
80         p[i].de = 1;
81         printf("%d/%d\n",p[i].nu,p[i].de);
82     }
83     return 0;
84 }
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3401360.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值