首页 > 其他分享 >图论2

图论2

时间:2023-10-16 18:24:37浏览次数:24  
标签:知识点 图论 int 1000005 long include root

Week 10

P1636 Einstein学画画

  • 知识点:欧拉路

    • 存在欧拉路的条件:图是连通的,有且只有2个奇点。

      存在欧拉回路的条件:图是连通的,有0个奇点。

  • 思路:统计所有点的度数:如果是奇数结果加一;

    如果是偶数则是途中的点,最后结果除以二。

    注意:连成一串的点所有点的度都是偶数,但是可以一笔画完。

    #include<bits/stdc++.h>
    using namespace std;
    int n, m, cnt[1005], ans;
    int main() {
    	cin >> n >> m;
    	for (int i = 1; i <= m; i++) {
    		int x, y;
    		cin >> x >> y;
    		cnt[x]++; 
    		cnt[y]++; 
    	}
    	for (int i = 1; i <= n; i++) {
    		if (cnt[i]%2!=0) {
    			ans++;
    		}
    	}
    	if (ans == 0) {
    		cout << 1;
    	}
    	else {
    		cout << ans / 2;
    	}
    	system("pause");
    	return 0;
    }
    

P8654 [蓝桥杯 2017 国 C] 合根植物

  • 知识点:并查集问题

    #include<bits/stdc++.h>
    using namespace std;
    int root[1000005],ans=0,num[1000005];
    int find(int x)
    {
    	if(root[x]==x) return x;
    	return root[x]=find(root[x]);
    }
    void unite(int a,int b)
    {
    	int root1=find(a);
    	int root2=find(b);
    	if(root1!=root2) root[root2]=root1;
    }
    int main()
    {
    	int n,m,k;
    	cin>>n>>m;
    	cin>>k;
    	memset(num,0,sizeof(num));
    	for(int i=1;i<=n*m;i++)
    	{
    		root[i]=i;
    	}
    	for(int i=1;i<=k;i++)
    	{
    		int a,b;
    		cin>>a>>b;
    		unite(a,b);
    	}
    	for(int i=1;i<=n*m;i++)
    	{
    		num[find(i)]=1;
    	}
    	for(int i=1;i<=n*m;i++)
    	{
    		if(num[i]) ans++;
    	}
    	cout<<ans<<endl; 
    	return 0;
    }
    
    

P3958 [NOIP2017 提高组] 奶酪

  • 知识点:并查集
  • 思路:记录每个与上表面和下表面相交或相切的球,然后把每个球进行并查集的归类。把每个与上表面和下表面相交或相切的球进行并查集查找“父亲”的判断,如果是同一个“父亲”,则答案为可行。
#include<bits/stdc++.h>
using namespace std;
unsigned long long r, n, h, jud;
unsigned long long m[1005];
struct dong {
    double x, y, z;
};
dong p[1005];
bool pd(dong a, dong b) {
    long long d;
    d = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z);
    if (d <= 4 * r * r) return true;
    else return false;
}
void run(int x) {
    if (jud == 1) return;
    if (p[x].z + r >= h) {
        jud = 1;
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (m[i] == 1) continue;
        if (pd(p[x], p[i])) {
            m[i] = 1;
            run(i);
        }
    }
}
int main() {
    int T;
    cin >> T;
    for (int j = 1; j <= T; j++) {
        cin >> n >> h >> r;
        jud = 0;
        for (int i = 1; i <= n; i++) {
            m[i] = 0;
        }
        for (int i = 1; i <= n; i++) {
            cin >> p[i].x >> p[i].y >> p[i].z;
        }
        for (int i = 1; i <= n; i++)
            if (p[i].z <= r) {
                m[i] = 1;
                run(i);
            }
        if (jud == 1) {
            cout << "Yes" << endl;
        }
        else {
            cout << "No" << endl;
        }
    }
    return 0;
}

P1119 灾后重建

  • 知识点:Floyd思想
#include<bits/stdc++.h>
using namespace std;
int n,m,q,now=0;
int tt[205],f[205][205];
void floyd(int k)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
		}
	}
	return;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>tt[i];
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i==j) f[i][i]=0;
			else f[i][j]=0x3ffffff;
		}
	}
	int x,y,d;
	for(int i=0;i<m;i++)
	{
		cin>>x>>y>>d;
		f[x][y]=f[y][x]=d;
	}
	cin>>q;
	int a,b,t;
	for(int i=0;i<q;i++)
	{
		cin>>a>>b>>t;
		while(tt[now]<=t&&now<n)
		{
			floyd(now);
			++now;
		}
		if(tt[a]>t||tt[b]>t) cout<<-1<<endl;
		else
		{
			if(f[a][b]==0x3ffffff) cout<<-1<<endl;
			else cout<<f[a][b]<<endl;
		}
	}
	return 0;
}

P2504 [HAOI2006]聪明的猴子

  • 知识点:生成树
  • 思路:把每条边进行Kruskal算法,然后加入到同一个连通图,每次更新最大边。
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0;
double num=-1.0;
int a[1000005][3],ty[1000005],root[1000005];
struct tre{
	int t1,t2;
	double dis;
}tree[1000005];
int cmp(tre a,tre b)
{
	return a.dis<b.dis;
}
int find(int x)
{
	if(root[x]==x) return x;
	return root[x]=find(root[x]);
}
int main()
{
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>ty[i];
	}
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i][0]>>a[i][1];
	}
	int k=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i!=j)
			{
				k++;
				tree[k].t1=i;
				tree[k].t2=j;
				tree[k].dis=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));//计算边的大小
			}
		}
	}
	int pos=n;
	sort(tree+1,tree+k+1,cmp);
	for(int i=1;i<=n;i++)
	{
		root[i]=i;
	}
	for(int i=1;i<=k;i++)
	{
		if(pos==1) break;
		int s1=find(tree[i].t1);
		int s2=find(tree[i].t2);
		if(s1!=s2)
		{
			root[s1]=s2;
			pos--;
			num=tree[i].dis;
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(num<=ty[i]) ans++;
	}
	cout<<ans<<endl;
	return 0;
}

标签:知识点,图论,int,1000005,long,include,root
From: https://www.cnblogs.com/xiaoyangii/p/17768034.html

相关文章

  • 图论
    Week9图论P5318【深基18.例3】查找文献思路:用vector存单向图,排序,深搜光搜注意:“如果有很多篇文章可以参阅,请先看编号较小的那篇”,需要排序(按终点由小到大排列,终点相同则起点有小到大#include<bits/stdc++.h>usingnamespacestd;structedge{ intu,v;};v......
  • 图论的一些知识
    tarjan算法虚树DAG剖分矩阵树定理最小树形图()斯坦纳树(感觉可以看看?)同余最短路平面图and对偶图线性规划网络流一般图最大匹配Prüfer序列竞赛图稳定婚姻问题2-sat仙人掌Dilworth定理()tarjan算法有向图\(\to\)强连通分量无向图\(\to\)广义圆方树......
  • 搜索与图论2.2-Floyd算法
    一、简述\(Floyd\)算法是一种可以快速求解图上所有顶点之间最短路径的算法。\(Bellman-Ford\)和\(Dijkstra\)算法求解的都是从一个起始点开始的最短路。如果想要求解图中所有顶点之间的最短路,就需要枚举每个点做为起点,这样十分低效。\(Floyd\)算法(也称\(Floyd-Warshall\)......
  • 图论总结
    图论树和图的存储`树是特殊的图,无环的联通图图分为有向图和无向图,无向图是一种特殊的有向图`邻接矩阵存稠密图,空间复杂度\(O(n^2)\)g[u][v]=w;邻接表voidinit(){ for(inti=0;i<N;i++) h[i]=-1;}voidadd(inta,intb){//在链表头插......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance(图论)
    CodeforcesRound903(Div.3)F.MinimumMaximumDistance思路对标记点更新fg,从0开始进行bfs,更新d1为所有点到0的距离获得到0最远的标记点L,从L开始bfs,更新d2为所有点到L的距离获得距离L最远的标记点R,从R开始bfs,更新d3为所有点到R的距离遍历所有点,这个点与标记点的最大距......
  • 图论
    \(DFS\)\(DFS\)全称是\(Depth\First\Search\),中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。\(DFS\)最显著的特征在于其递归调用自身。同时与\(BFS\)类似,\(DFS\)会对其访问过的点打上访问标记,在遍历图时跳过已......
  • 图论——树上问题 学习笔记
    图论——树上问题学习笔记目录树的直径树的重心树的中心经典问题1:最小化最大距离树的直径定义树上任意两节点之间最长的简单路径即为树的直径。显然,一棵树可以有多条直径,他们的长度相等。性质若树上所有边边权均为正,则树的所有直径有交,且中点重合;有树的直径\((p,q......
  • 图论
    图论这……感觉是知识点多,算法多,但用的频率不一定高,容易忘记,这里就整点板子防老年痴呆欧拉路径即一笔画问题,定义为:图中经过所有边恰好一次的路径叫欧拉路径。如果此路径的起点和终点相同,则称其为一条欧拉回路。注意图必须连通,可用并查集或dfs判断关于判断欧拉路径是否存在:以......
  • MATLAB图论工具箱(哪有什么工具箱,就只是一堆函数而已)
    MATLAB图论工具箱图论基础Matlab图论工具箱提供了构建、操作和分析图形的函数和工具。在Matlab图论工具箱中,可以使用以下基本数据结构:graph:无向图。digraph:有向图。可以使用以下函数创建一个图或有向图:graph:创建一个无向图。digraph:创建一个有向图。%创建无......
  • 图论总结
    最小生成树相关次小生成树、生成树边替代对于一条非树边\((u,v)\),它替代树\(u,v\)链上的最大值,对答案的影响最小。用倍增或树链剖分维护。对于一条树边,如果非树边\((u,v)\)满足这条边在链\(u,v\)上,它被满足这个条件的权值最小的边替代对答案的影响最小。把非树边按权值......