图论笔记√

首先最简单的存图方式:邻接矩阵

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;
}
View Code

 

 //占用内存很大不过很好理解


 邻接表

 因为在单个一维数组中没办法正常表示图,那么我们就根据加入边的顺序给每个边一个编号,第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行每行三个数
x,y,w,表示xy直接有一条w的无向边
然后输出n-1个数
第i个数表示i+1号节点到1的距离

 

 

 


 

posted @ 2016-08-24 18:03  pandaB  阅读(278)  评论(0编辑  收藏  举报