引用第2楼jiju84于2007-04-16 23:23发表的:以无向网表示n个城市之间的交通网络建设规划Hamilton图?妙似以前建模的时候写过matlab版的.........
引用第4楼jiju84于2007-04-16 23:26发表的:求第一个城市到其它城市的最短路径的Matlab程序如下:clear;clc;M=10000;a(1,:)=[0,50,M,40,25,10];.......
引用第6楼vvcmoon于04-16-2007 23:30发表的:确定没错么没错的话将送上感激的FY我是一点都看不懂
// Solution by OUSAA// Optimized with binary heap#include <stdio.h>#include <string.h>#define N 1024 //节点个数struct node //邻接表数据结构{int t,v;struct node* next;} *adj[N],e[N*N];struct edge // 堆{int t,v;} heap[N];int vis[N]; // 表示某点是否访问多int q[N],tail; // q indicates the position of v in heapint sum; // weight of MSTint n,m; // n is number of vertex, m is number of edges// 插入一个节点到邻接表void insert(int s,int t,int v,int i){e[i].t=t;e[i].v=v;e[i].next=adj[s];adj[s]=e+i;}// 输入数据// 格式:1 2 3,表示节点1,2 之间有一条权为3的边void input(){int i,s,t,v;for (i=0;i<m;++i) { scanf("%d %d %d",&s,&t,&v); insert(s,t,v,i*2); insert(t,s,v,i*2+1);}}//向上更新堆void fix_up(int b){int i,k;struct edge p;p=heap[i=b];while ((k=i/2)>0) { if (heap[k].v<p.v) break; heap[i]=heap[k]; q[heap[i].t]=i; i=k;}heap[i]=p;q[p.t]=i;}//向下更新堆void fix_down(){int i,k;struct edge p;p=heap[i=1];while ((k=i*2)<=tail) { if (k<tail && heap[k+1].v<heap[k].v) ++k; if (heap[k].v>p.v) break; heap[i]=heap[k]; q[heap[i].t]=i; i=k;}heap[i]=p;q[p.t]=i;}// 插入一个元素或更新一个已有元素到堆void put(int t,int v){if (!q[t]) { heap[++tail].t=t; heap[tail].v=v; q[t]=tail; fix_up(tail);}else { if (v>=heap[q[t]].v) return; heap[q[t]].v=v; fix_up(q[t]);}}// 获取堆的一个元素struct edge get(){struct edge p=heap[1];heap[1]=heap[tail--];q[heap[1].t]=1;fix_down();return p;}// prim中的更新距离表部分void update(int u){struct node* p;p=adj[u];while (p) { if (!vis[p->t]) put(p->t,p->v); p=p->next;}}// prim的主过程void solve(){struct edge ed;update(1);vis[1]=1;while (tail) { ed=get(); sum+=ed.v; vis[ed.t]=1; update(ed.t);}printf("The weight is %d\n",sum);}//输入n和mint main(){scanf("%d %d",&n,&m);input();solve();return 0;}
引用第9楼richardxx于2007-04-16 23:44发表的:lz不要忘了给点FY哦,我是比较穷的。。
引用第12楼kangtalc于2007-04-17 08:11发表的:参考此帖,有注释~~http://192.168.2.8/bbs/read.php?tid=341384&fpage=2