图的子图求值问题
Problems in evaluating subgraphs of a graph
这是问题链接。
给定一个无向图。密度图<一口> | E | 一口>⁄<子> V | | 子>。你的任务是选择一组非空的顶点V,使得在V上产生的子图具有最大的密度,并打印这个密度。但如果最大密度严格大于1,则只需打印">1"。
最大顶点数:105
最大边数:105
我只是做了一个简单的解,但在这个解中,我可以跟踪整个图,但我如何得到更小的子图的密度值?
#include<iostream>
#include<vector>
using namespace std;
vector<int> adj[1000002]; // adjacency lists adj for storing graph edges
int node=0; // initializing for node value(vertices)
bool visited[100001]={false}; // keeps track of visited nodes(vertices)
int edge=-1;
int ans=-1;
int n; // keeps optimum value of no. of nodes
int e; // keeps optimum value of no. of edges
void dfs(int s)
{
node++;
edge++;
if(edge>0)
{
float dummy=(float)edge/(float)node;
if(dummy>ans)
{ans=dummy;
e=edge;
n=node;
}
}
visited[s]=true;
int t;
for(int i=0;i!=adj[s].size();i++)
{ t=adj[s][i];
if(visited[t]==false)
{
dfs(t);
}
}
}
int main()
{
long long v,ed,i,j,x,y;
cin>>v>>ed;
for(long long k=0;k<ed;k++)
{
cin>>x>>y;
adj[x].push_back(y);
adj[y].push_back(x);
}
if(ed>v)
cout<<">1"<<endl;
else{
for(i=1;i<=v;i++)
{
if(visited[i]==false)
{
node=0;
edge=-1;
dfs(i);
//cout<<e<<"/"<<n<<endl;
}
}
cout<<e<<"/"<<n<<endl;}
}
遵循以下步骤可以获得更好的效果:
1。对每个组件执行dfs以获得答案。
2。避免你正在做的浮点计算,尝试所有的整数计算。
3。没有理由在这里使用范围
的long long
将代码修改成这样应该可以工作:
#include<iostream>
#include<vector>
using namespace std;
vector<int> adj[1000002]; // adjacency lists adj for storing graph edges
int node=0; // initializing for node value(vertices)
bool visited[100001]={false}; // keeps track of visited nodes(vertices)
int edge=0;
void dfs(int s)
{
node++;
visited[s]=true;
int t;
edge+=adj[s].size();
for(int i=0;i!=adj[s].size();i++)
{
t=adj[s][i];
if(visited[t]==false)
{
dfs(t);
}
}
}
int main()
{
int v,ed,i,j,x,y;
cin>>v>>ed;
for(int k=0;k<ed;k++)
{
cin>>x>>y;
adj[x].push_back(y);
adj[y].push_back(x);
}
int mark[3]; mark[0]=mark[1]=mark[2]=0;
int mx_node=0;
for(i=1;i<=v;i++)
{
if(visited[i]==false)
{
node=0;
edge=0;
dfs(i);
edge/=2;
if(node>edge){
mark[0]=1;
mx_node=mx_node<node?node:mx_node;
}
else if(node==edge) mark[1]=1;
else mark[2]=1;
}
}
if(mark[2]) printf(">1n");
else if(mark[1]) printf("1n");
else printf("%d/%dn",mx_node-1,mx_node);
}
相关文章:
- 如何在 boost 中访问现有图的子图
- 以编程方式连接子图
- 需要使用boost ::图形从一个大图中找到子图
- 子图的图形特征
- 提升图相等性和子图
- 如何删除提升图的子图
- 子图和图连接在提升
- Boost子图复制构造函数不适用于Qt 5.0.2和MinGW
- 如何访问提升子图'graph'属性?
- 使用write_graphviz()打印组成的子图
- 列表或指针的问题,图的邻接表示
- Boost子图实现和使用Graphml导出
- 是否有任何方法可以使用c++ libgraph为子图设置默认节点属性?
- 我应该用过滤图还是子图,还是别的什么
- 为什么Boost VF2子图同构给出一个不正确的答案
- 图的子图求值问题
- Boost子图和捆绑属性
- 查找子图中的边
- 如何有效地实现具有大量大完整子图的图
- 如何用集合顶点列表创建boost子图