图论笔记√
首先最简单的存图方式:邻接矩阵
mp[i][j]表示从i->j有一条边权为mp[i][j]的边//如果是无限大的话就是算作没有边
e.g.http://218.5.5.242:9018/JudgeOnline/problem.php?id=1144
这里mp[xx][yy]=(xx和yy的距离)//mp[i][i]要初始化成0因为自己到自己的距离是0
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 2000022800.00 using namespace std; int n,m; double x[105],y[105]; double a[105][105]; double mp[105][105]; double MIN(double x,double y) { if(x>y)return y; else return x; } int main() { scanf("%d",&n); // memset(mp,127/3,sizeof(mp)); for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)mp[i][j]=inf; for(int i=1;i<=n;++i) { mp[i][i]=0; scanf("%lf%lf",&x[i],&y[i]); } cin>>m; for(int i=1;i<=m;++i) { int xx,yy; scanf("%d%d",&xx,&yy); mp[xx][yy]=sqrt((x[xx]-x[yy])*(x[xx]-x[yy])+(y[xx]-y[yy])*(y[xx]-y[yy])); } int xx,yy; cin>>xx>>yy; for(int k=1;k<=n;++k) { for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { mp[i][j]=MIN(mp[i][j],mp[i][k]+mp[k][j]); } } } printf("%.2lf",mp[xx][yy]); puts(""); return 0; }
//占用内存很大不过很好理解
邻接表
因为在单个一维数组中没办法正常表示图,那么我们就根据加入边的顺序给每个边一个编号,第i个加入的就是i
/*
比如1->2是第1个加入的,那么他们的编号就是1
由于这时候他们后面没有边了,那么next[1]=0;last[1]=1 // last[1]当前最后一条边就是第一条边
那么当我们插入第三条边1->4的时候,next[3]=last[1],表示第三条边的上一条是last[1],也就是第一条边。然后这时候last[1]=3,因为这时候第一个点连出去的最后一条边是第三条边了
*/
void ins(int a , int b , int c) ////存图 insert加边
{
//ecnt:数有几条边
to[++ecnt] = b;//to[i]是记录这条边是到哪个点的
next[ecnt] = last[a];//next[i]是和i同一个起点出发的下一条边,i是点的编号
last[a] = ecnt;//last表示a为起点的边里面的编号最后的一条的编号是多少
w[ecnt] = c;//w[i]是边权
}
//别忘了是无向边需要 ins(a,b,c); ins(b,a,c);
//by zls
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<vector> 6 7 using namespace std; 8 9 10 vector<int>to[100005],w[100005]; 11 int n,m; 12 int a,b,c; 13 14 int main() 15 { 16 scanf("%d",&n); 17 for(int i=1;i<n;++i) 18 { 19 scanf("%d%d%d",&a,&b,&c); 20 to[b].push_back(a); 21 w[b].push_back(c); 22 to[a].push_back(b); 23 w[a].push_back(c); 24 } 25 }
//比较难理解不过原理和邻接矩阵差不多
e.g.
n个节点的有根树
根是1
节点编号1~n
第一行一个数n,表示节点数,100000
接下来n-1行每行三个数
根是1
节点编号1~n
第一行一个数n,表示节点数,100000
接下来n-1行每行三个数
x,y,w,表示xy直接有一条w的无向边
然后输出n-1个数
第i个数表示i+1号节点到1的距离
然后输出n-1个数
第i个数表示i+1号节点到1的距离