题目:编写程序,实现以邻接表做存储结构,实现求源点到其余各顶点的最短距离
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
ing namespace std;
typedef struct node{
int info;
int weight;
node* next;
}node,*Pnode;
Pnode li[100];//头节点
int sign[100];//标记是否用过,用于输出距离为无穷大的点
int star;//起点
void addnode(Pnode *li,int v1,int v2,int w){ //v1后面加入v2
Pnode p=(Pnode)malloc(sizeof(node));
p->info=v2;
p->weight=w;
Pnode temp=li[v1];
if(li[v1]==NULL) {
p->next=li[v1];
li[v1]=p;
} //当li[v1]后没有元素时
else if(li[v1]->next==NULL){
if(temp->info>v2) {
p->next=temp->next;
temp->next=p;}
else {
p->next=li[v1];
li[v1]=p;}
}//当LI[V1]后只有一个元素时
else {
while(temp->next->info>v2&&temp->next!=NULL)
temp=temp->next;
if(temp->next!=NULL){
p->next=temp->next;
temp->next=p;}
else{
p->next=NULL;
temp->next=p; }
} //普遍情况,找到合适的点插入结点
}//此处分了三种情况加入点
void creatList(Pnode *li,int n,int m){
for(int i=0;i<100;i++) sign[i]=0;//初始情况下,集合是为空
int v1,v2,w;
for(int i=0;i<=n;i++){
li[i]=NULL;
}//对头节点进行初始化
cin>>v1>>v2>>w;
addnode(li,v1,v2,w);
star=v1;
sign[star]=1;
for(int i=0;i<m-1;i++){
cin>>v1>>v2>>w;
addnode(li,v1,v2,w);
}//完成邻接表的创建,0不用
}
void Dijkstra(Pnode *li,int x,int n,int m){
Pnode min,m1,m2,q;
sign[x]=1;
int cnt=1;
while(cnt<n-1){ //循环n-1次,将剩余的n-1个点都加入集合S
min=(Pnode)malloc(sizeof(node));
q=li[x];
min->weight=100001;
while(q!=NULL){
if(q->weight<=min->weight)
min=q;
q=q->next;
}//每次找到最短距离min结点
int dis=min->weight;
int key=min->info;
sign[key]=1;//加入集合S
cout<<x<<" "<<min->info<<" "<<min->weight<<endl;//输出结果
Pnode m3;
m3=li[x];
if(li[x]==min) {
min=li[x];
li[x]=li[x]->next;
free(min); }
else{
while(1) {
if(m3->next=min) break;
else m3=m3->next;}
min=m3->next;
m3->next=min->next;
free(min); }
//分两种情况删除结点
m1=li[x];
m2=li[key];
while(m1!=NULL&&m2!=NULL){
if(m1->info>m2->info) m1=m1->next;//此处要小心,因为前大后小
else if(m1->info<m2->info) {
if(sign[m2->info]==0) addnode(li,x,m2->info,m2->weight+dis);
m2=m2->next; }
else {
if((dis+m2->weight)<m1->weight) m1->weight=dis+m2->weight;//改变最短距离
m1=m1->next;
m2=m2->next; }
}//分三种情况遍历
while(m2!=NULL){
if(sign[m2->info]==0) addnode(li,x,m2->info,m2->weight+dis);
m2=m2->next; }// 加入新的距离
cnt++;
}
int a=-1;
for(int i=1;i<=n;i++)
if(sign[i]==0) cout<<x<<" "<<i<<" "<<a<<endl; //输出距离为无穷大的点
}
int main(){
int m,n;
Pnode li[100];
li[100]=(Pnode)malloc(100*sizeof(node));
cin>>n>>m;//n为点数,m为边数
creatList(li,n,m);
Dijkstra(li,star,n,m);
return 0; }
第一次写博客,有点点激动
这次的代码依旧是调了很久很久…
但是我还是做出来啦,虽然代码可能没有那么漂亮
要一直加油加油~~
向Professor Wang看齐哇