【洛谷1262】间谍网络

tarjan缩点后找入度为零的强连通分量,加上它的sum即可

但注意到还有NO的可能,

所以大致有两种方法:

1.tarjan之前先来一遍bfs

2.tarjan内加一个数组维护最小编号

貌似前者比较好写qwq

  1 #include<cstdio>
  2 #include<cstring>
  3 using namespace std;
  4 const int N=3010,M=6020;
  5 const int novis=-1,nowvis=1,over=0;
  6 int value[N],sum[N],flag[N],vis[N],que[M],n;
  7 int head[M],next[M],to[M],size;
  8 int low[N],dfn[N],color[N],in[N],sig,cnt,top;
  9 void bfs(int),uni(int,int),tarjan(),dfs(int),rebuild();
 10 int min(int,int);
 11 int main(){
 12     int x,y,p,r,tmp,ans;
 13     ans=size=0;
 14     memset(vis,0,sizeof(vis));
 15     memset(sum,0,sizeof(sum));
 16     memset(flag,0,sizeof(flag));
 17     memset(in,0,sizeof(in));
 18     scanf("%d %d",&n,&p);
 19     for (int i=1;i<=n;i++)
 20         value[i]=10000001;//初始化最大值便于后面sum取min
 21     for (int i=1;i<=p;i++){
 22         scanf("%d %d",&x,&y);
 23         value[x]=y;
 24         flag[x]=1;
 25     }
 26     scanf("%d",&r);
 27     for (int i=1;i<=r;i++){
 28         scanf("%d %d",&x,&y);
 29         uni(x,y);
 30     }
 31     for (int i=1;i<=n;i++)
 32         if (!vis[i]) bfs(i);
 33     for (int i=1;i<=n;i++)
 34         if (!vis[i]&&!flag[i]){
 35             printf("NO\n%d",i);
 36             return 0;
 37         }
 38     tarjan();
 39     for (int i=1;i<=cnt;i++)
 40         if (!in[i]) ans+=sum[i];
 41     printf("YES\n%d",ans);
 42     return 0;
 43 }
 44 void uni(int x,int y){
 45     size++;
 46     next[size]=head[x];
 47     head[x]=size;
 48     to[size]=y;
 49 }
 50 void bfs(int x){
 51     int r,l,u,v;
 52     l=0;r=1;que[1]=x;
 53     while (l<=r){
 54         u=que[++l];
 55         for (int e=head[u];e;e=next[e]){
 56             v=to[e];
 57             if (!vis[v]) que[++r]=v;
 58             vis[v]=1;
 59         }
 60     }
 61 }
 62 void tarjan(){
 63     memset(flag,novis,sizeof(flag));
 64     sig=cnt=top=0;
 65     for (int i=1;i<=n;i++)
 66         if (flag[i]==novis) dfs(i);
 67     rebuild();
 68 }
 69 void dfs(int x){
 70     que[++top]=x;
 71     flag[x]=nowvis;
 72     low[x]=dfn[x]=++sig;
 73     for (int e=head[x];e;e=next[e]){
 74         int y=to[e];
 75         if (flag[y]==novis){
 76             dfs(y);
 77             low[x]=min(low[x],low[y]);
 78         }
 79         else if (flag[y]==nowvis)
 80             low[x]=min(low[x],dfn[y]);
 81     }
 82     if (low[x]==dfn[x]){
 83         cnt++;int t;
 84         if (!sum[cnt]) sum[cnt]=20001;
 85         do{
 86             t=que[top--];
 87             flag[t]=over;
 88             color[t]=cnt;
 89             sum[cnt]=min(sum[cnt],value[t]);
 90         }while (t!=x);
 91     }
 92 }
 93 void rebuild(){//入度
 94     for (int u=1;u<=n;u++)
 95         for (int e=head[u];e;e=next[e]){
 96             int v=to[e];
 97             if (color[u]!=color[v])
 98                 in[color[v]]++;
 99         }
100 }
101 int min(int x,int y){
102     return x<y?x:y;
103 }

STD

时间: 2024-11-08 22:24:37

【洛谷1262】间谍网络的相关文章

tarjan缩点以及链式前向星的基本+应用(洛谷1262 间谍网络)

题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时我们还知道哪些间谍手中具体掌握了哪些

洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关

洛谷 P1262 间谍网络

P1262 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时我们还知道哪些

洛谷——P1262 间谍网络

P1262 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时我们还知道哪些

洛谷P1262 间谍网络

本来只想刷道小题,没想到还有点麻烦 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时

洛谷 P1262 间谍网络 Label: Kosarajn说:我就是不用Tarjan &amp;&amp; Tarjan待做

题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时我们还知道哪些间谍手中具体掌握了哪些

洛谷 P2038 无线网络发射器选址(NOIp2014D2T1)

题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值 1 .东西向街道从北到南依次编号为0,1,2-128 , 南北向街道从西到东依次编号为0,1,2-128 . 东西向街道和南北向街道相交形成路口,规定编号为x 的南北向街道和编号为y 的东西向街道形成的路口的坐标是(x , y ). 在 某 些 路口存在一定数量的公共

洛谷 P1546 最短网络 Agri-Net Label:Water最小生成树

题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000 输入输出格式 输入格式: 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一

洛谷P1546 最短网络 Agri-Net

P1546 最短网络 Agri-Net 526通过 959提交 题目提供者JOHNKRAM 标签图论贪心USACO 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 50分C++代码,求解 请指教哪里出现了问题,只有… 求解为什么只有40分 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所