第11章 图论模型与算法

再谈树

无根树转有根数

#include
using namespace std;
const int maxn = 100;
vector G[maxn];
int n;
void read_tree(){
    int u,v;
    scanf("%d",&n);
    for(int i=0;iconst int maxn = 100;
int lch[maxn], rch[maxn]; char op[maxn]; //每个结点的左右子节点编号和字符
int nc=0; //结点数
int build_tree(char * s,int x,int y){
    int i,c1=-1,c2=-1,p=0;
    int u;
    if(y-x==1) { //进一个字符建立单独结点
        u = ++nc;
        lch[u]=rch[u]=0; op[u]=s[x];
        return u;
    }
    for(i=x;i

for(int i=0;i
表达式树

const int maxn = 100;
int lch[maxn], rch[maxn]; char op[maxn]; //每个结点的左右子节点编号和字符
int nc=0; //结点数
int build_tree(char * s,int x,int y){
    int i,c1=-1,c2=-1,p=0;
    int u;
    if(y-x==1) { //进一个字符建立单独结点
        u = ++nc;
        lch[u]=rch[u]=0; op[u]=s[x];
        return u;
    }
    for(i=x;i


例题11-1 公共表达式消除  uva12219

#include
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 105;
struct Edge {
    int u,v,cost;
    bool operator < (const Edge& a) const {
        return cost > a.cost;
    }
};
int F[MAXN];int n,m;vector edges;
int find(int x){
    return x==F[x]?x:F[x]=find(F[x]);
}
int kruskal(int k){
    for(int i=0;i<=n;i++) F[i]=i;
    int cnt=0;
    int minn=INF,maxn=0;
    for(int i=k;i

例题11-3 买还是建 uva1151

#include
using namespace std;
const int maxn = 1005;
struct point {
    int x,y;
}pp[maxn];
struct edge
{
    int s,e,dist;
}l[maxn*maxn];
int n,q,m;
int p[maxn];
vector g[10];
int c[10];
int distance_(point a,point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool cmp(edge a,edge b){
    return a.dist < b.dist;
}
int find_(int x){
    return p[x]==x?x:p[x]=find_(p[x]);
}
bool merge_(int a,int b){
    int x=find_(a);
    int y=find_(b);
    if(x==y) return false;
    p[x]=y; return true;
}
int kruskal(){
    int ans=0;
    int num=0;
    for(int i=0;i>j)&1)) continue;
            cost += c[j];
            for(int k=0;k

Dijkstra算法:


你可能感兴趣的:(UVA)