hdu6165

news/2024/11/25 15:31:42/

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165

题意:一张有向图,n个点,m条边,保证没有重边和自环。询问任意两个点能否满足任何一方能够到达另外一方。

思路:枚举每个点,预处理搜出与这个点相连接的所有点,看看能不能搜出一条链出来,当然要注意一种情况,u-v,v-u这种也是可行的,特殊处理一下。

代码DFS:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
vector<int>edge[maxn];
bool vis[maxn],dis[maxn][maxn];
int n,m,pos;
void dfs(int u)
{vis[u]=true;dis[pos][u]=true;for(int i=0;i<edge[u].size();i++){int v=edge[u][i];if(vis[v]) continue;dfs(v);}
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){edge[i].clear();}for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);edge[u].push_back(v);}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dis[i][j]=false;}}int flag=1;for(int i=1;i<=n;i++){memset(vis,false,sizeof(vis));pos=i;dfs(i);}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(dis[i][j]==false&&dis[j][i]==false){flag=0;break;}}}if(!flag) printf("Light my fire!\n");else printf("I love you my love and our love save us!\n");}return 0;
}


BFS

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
bool vis[maxn], dis[maxn][maxn];
vector<int>edge[maxn];
int n, m, pos;
void BFS(int u)
{queue<int>q;q.push(u);while(!q.empty()){int now=q.front();q.pop();if(vis[now]) continue;vis[now]=true;dis[pos][now]=true;for(int i = 0; i < edge[now].size(); i++){int v = edge[now][i];if(vis[v]) continue;q.push(v);}}
}
int main()
{int T;scanf("%d", &T);while(T--){scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) edge[i].clear();for(int i = 1; i <= m; i++){int u, v;scanf("%d%d", &u, &v);edge[u].push_back(v);}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){dis[i][j] = false;}}for(int i = 1; i <= n; i++){memset(vis, false, sizeof(vis));pos = i;BFS(i);}int flag = 1;for(int i = 1; i <= n; i++){for(int j = i + 1; j <= n; j++){if(dis[i][j] == false && dis[j][i] == false){flag = 0;break;}}}if(!flag) puts("Light my fire!");else puts("I love you my love and our love save us!");}return 0;
}
tarjan代码:
tarjan学习:http://www.cnblogs.com/uncle-lu/p/5876729.html
思路:tarjan部分直接上模板,主要思路就是缩点成链之后进行拓扑排序,因为它要求的是任意两点任何一点能够到达另外一点,所以就如果入度为0的点的个数大于等于两个,那就是不满足的。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int dfn[maxn];//dfs顺序
int low[maxn];
int index1;//记录时间的标号
bool state[maxn];//是否在栈里.
stack<int>s;
vector<int>G[maxn];
vector<int>g[maxn];
int cnt[maxn];
int num[maxn], du[maxn];//num数组不一定要,各个强连通分量包含点的个数,数组编号1~cnt
int scc,flag;//scc为强连通分量的个数
int vis[maxn];
void init()
{scc = 0,flag=0;memset(du, 0, sizeof(du));memset(state, false, sizeof(state));memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));memset(cnt, 0, sizeof(cnt));memset(vis, false, sizeof(vis));memset(num, 0, sizeof(num));while(!s.empty())s.pop();for(int i = 0; i < maxn; i++){G[i].clear();g[i].clear();}
}
void tarjan(int u)//tarjan 处理强连通分量。
{dfn[u] = low[u] = ++index1;s.push(u);state[u] = true;vis[u] = true;for(int i = 0; i < G[u].size(); i++){int w = G[u][i];if(!vis[w]){tarjan(w);low[u] = min(low[w], low[u]);}else if(state[w]){low[u] = min(low[u], dfn[w]);}}if(low[u] == dfn[u]){scc++;for(;;){int x = s.top();s.pop();cnt[x] = scc;//标记v点属于哪个强连通分量num[scc]++;//记录这个强连通分量有多少个点组成state[x] = false;if(x == u)break;}}
}
void topsort()
{queue<int>q;int sizz=0;for(int i=1;i<=scc;i++){if(!du[i]){sizz++;q.push(i);}}if(sizz>=2) flag=1;//如果刚缩点后就有两个以上度为0的坑定不可以啊while(!q.empty()&&!flag){int u=q.front();q.pop();int siz=0;for(int i=0;i<g[u].size()&&!flag;i++){int to=g[u][i];du[to]--;if(du[to]==0){siz++;q.push(to);}if(siz>=2) flag=1;}if(flag) break;}
}
int main()
{int T;scanf("%d",&T);while(T--){int n,m;scanf("%d%d",&n,&m);init();for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);G[u].push_back(v);}for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i);}}for(int i=1;i<=n;i++)//新建图{int u=cnt[i];for(int j=0;j<G[i].size();j++){int v=cnt[G[i][j]];if(u!=v){g[u].push_back(v);du[v]++;//入度}}}topsort();if(flag) puts("Light my fire!");else puts("I love you my love and our love save us!");}return 0;
}





http://www.ppmy.cn/news/507309.html

相关文章

ActiveMQ配置wss

最近把前端页面由原来的http升级为了https&#xff0c;发现之前ActiveMQ提供的ws不能强求了&#xff0c;https服务下要求升级到wss。全网搜索了下&#xff0c;没有找到一个靠谱的文档 一、 证书准备 使用wss连接服务必须使用域名端口&#xff0c;而不能使用ip端口&#xff0c;这…

Libreoj #6165. 一道水题 (快速线性筛素数)

题意&#xff1a;求出能整除[1,n]中所有数的最小整数&#xff0c;对100000007取模。&#xff08;注意是1e87&#xff01;&#xff01;&#xff01;&#xff09; 思路&#xff1a;首先用线性筛筛出[1,n]的所有素数&#xff0c;记为p[i]。答案是对每个p[i]&#xff0c;求出最大的…

ESP32 Wi-Fi、BLE 等示例的固件大小及优化 相关组件大小对比

一. 测试目的 经常会有开发者提出基于 ESP32 Wi-Fi、BLE 等示例的固件大小及优化 & 相关组件大小对比&#xff0c;本文将测试针对相关示例进行修改测试。 二. 测试环境 为了保证测试结果的一致性&#xff0c;采用以下测试环境: esp-idf 编写本文时&#xff0c;使用的 esp…

IEC61850简要介绍

简介 IEC61850标准是电力系统自动化领域唯一的全球通用标准。它通过标准的实现&#xff0c;实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明。此标准参考和吸收了已有的许多相关标准,其中主要有:IEC870-5-101远动通信协议标准; IEC870-5-103…

MQTT之https页面请求问题

网站开启了https&#xff0c;开始总会遇到各种问题&#xff0c;用户登入认证失败&#xff0c;视频请求失败&#xff0c;mqtt连接失败等问题。是不是很不爽&#xff0c;来看看&#xff0c;教你怎么解决这些问题。 1.网站开启https&#xff0c;mqtt连接失败 解决过程&#xff0c;…

HDU - 6165

题目链接&#xff1a;HDU - 6165 显然可以n次bfs&#xff0c;求连通性。但是时间卡得很紧。 这里我们可以 O(nm)的复杂度解决。 先缩点变成DAG&#xff0c;然后缩点的图上跑Top&#xff0c;如果某一时刻&#xff0c;一个点可以让两个及以上的点度为0&#xff0c;那么显然就无…

hdu6155

Subsequence Count 题目链接 ccpc网络赛1006 题意是给一个01字符串&#xff0c;然后有2种操作&#xff0c; 1、把l到r这个区间的字符翻转&#xff0c; 2、查询l到r这个区间有多少个不同的子序列&#xff0c;&#xff08;注意是子序列&#xff0c;可不连续&#xff09;&…

IEC61850

IEC 61850是关于变电站自动化系统结构和数据通信的国际标准&#xff0c;目的是使变电站内不同厂家的智能电子设备(IED)之间通过一种标准实现互操作和信息共享&#xff0c;取消多种协议转换环节和转换设备&#xff0c;使系统调试更加便捷&#xff0c;实现“一个世界、一种技术、…