c語言實現prim演算法

參數傳遞應該沒有問題
for(i=0;i<g->vexnum;i++) scanf("%s",&g->vexs[i]); //是不是這里錯了?

Ⅱ 求數據結構(C語言)prim演算法求最小生成樹

PrimMST(G,來T,r){
//求圖G的以r為根的MST,結果自放在T=(U,TE)中
InitCandidateSet(…);//初始化:設置初始的輕邊候選集,並置T=({r},¢)
for(k=0;k<n-1;k++){ //求T的n-1條樹邊
(u,v)=SelectLiShtEdge(…);//選取輕邊(u,v);
T←T∪{(u,v)};//擴充T,即(u,v)塗紅加入TE,藍點v並人紅點集U
ModifyCandidateSet(…); //根據新紅點v調整候選輕邊集
}
}

Ⅲ 對任意的網和起點,用PRIM演算法的基本思想求解出所有的最小生成樹(C語言編寫)

prim基本思想就是貪心,每次加最短的邊
既然要求所有的
那就判斷如果有兩條或更多條都是最小,那就分支出多種情況。

Ⅳ 用c語言描述prim演算法求最小生成樹.... 求高人指點啊,給出完整的代碼,那個鄰接矩陣是要要一次全部輸入的

#include <cstdio>
#include <iostream>
#include <memory.h>
using namespace std;
const int maxn=102;
const int inf=1<<30;
int map[maxn][maxn];
int dis[maxn];
bool flag[maxn];
int a,b,c,n,m,ans;

void init()
{
memset(map,-1,sizeof(map));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]==-1 || c< map[a][b])
{
map[a][b]=map[b][a]=c;
}
}
}

void prim()
{
memset(flag,false,sizeof(flag));
for(int i=1;i<=n;i++)dis[i]=inf;
dis[1]=0;
ans=0;
for(int j=1;j<=n;j++)
{
int now,value=inf;
for(int i=1;i<=n;i++)
{
if(flag[i]==false && dis[i]<value)
{
value=dis[i];
now=i;
}
}
if(value==inf)
{
cout << "-1" <<endl;
return;
}
flag[now]=true;
ans+=dis[now];
for(int i=1;i<=n;i++)
{
if(!flag[i] && map[now][i]!=-1 && dis[i]>map[now][i])
dis[i]=map[now][i];
}
}
cout << ans <<endl;
}

int main()
{
//'freopen("in.txt","r",stdin);
while(cin >> n >> m)
{
init();
prim();
}
return 0;
}

測試數據:
Sample Input
3 3
1 2 1
1 3 1
2 3 3
Sample Output
2
既然問到了演算法相信你能看懂測試數據是什麼意思~

Ⅳ 求c語言程序代碼

DDMS中Log信息分為幾個級別(5個)

下列哪個是AbsoluteLayout中特有的屬性(android:layout_x )

創建子菜單的方法是(B)
A,add B,addSubMenu C,createSubMenu D,createMenu

使用AIDL完成遠程service方法調用下列說法不正確的是(A)
A, aidl對應的介面名稱不能與aidl文件名相同
B, aidl的文件的內容類似java代碼
C, 創建一個Service(服務),在服務的onBind(Intent intent)方法中返回實現了aidl介面的對象
D, aidl對應的介面的方法前面不能加訪問許可權修飾符

進度條中哪個屬性是設置進度條大小格式的(D)
A,android:secondaryProgress B,android:progress C,android:max D,style

表示下拉列表的組件是(B)
A,Gallery B,Spinner C,GridView D,ListView

關於android中播放視頻的說法不對的是(C)
A,可以使用SurfaceView組件播視頻
B,可以使用VideoView組件播視頻
C,VideoView組件可以控制播放的位置和大小
D,VideoView播放視頻的格式可以是3gp

下列哪個是SqlLite下的命令(C)
A,shell B,push C,.quit D,keytool

下列關於 open core說法不正確的是(B)
A, Open core是Android多媒體框架的核心
B, MediaPlayer是open Core中的一個核心類
C, 所有在Android平台的音頻、視頻的採集以及播放等操作都是通過它來實現的
D, 在實現開發中我們並不會過多地研究open core的實現,我們的Android為我們提供了上層的media api的開發使用

拖動條組件是(C)
A,RatingBar B,ProgressBar C,SeekBar D,ScrollBar

關於隱式Intent正確的是(A)
A, android中使用IntentFilter 來尋找與隱式Intent相關的對象
B,通過組件的名稱尋找與intent相關聯的對象
C, 隱式Intent更多用於在應用程序內部傳遞消息
D, 一個聲明了IntentFilter的組件只能響應隱式Intent請求

多選框被選擇事件通常用(B)
A,setOnClickListener B,setOnCheckChangeListener
C, setOnMenuItemSelectedListener D,setOnCheckedListener

自定義對話框時,將視圖對象添加到當前對話框的方法是(D)
A,setIcon B,setXML C,setLayout D,setView

下列不屬於service生命周期的方法是(C)
A,onCreate B,onDestroy C,onStop D,onStart

綁定Service的方法是(A)
A,bindService B, startService C,onStart D,onBind

下列屬於補間動畫相關類的是(ACD)
A, TranslateAnimation B, FrameAnimation
C, RotateAnimation D, AlphaAnimation

下列哪些 api 的操作需要聲明許可權(CD)
A、播放 mp3 文件 B、讀 SD 卡 (讀 sd 卡狀態) C、發簡訊 D、訪問網路

在 android 中使用 SQLiteOpenHelper 這個輔助類時,哪些操作可能生成一個資料庫, ab
A、getWriteableDatabase() B、getReadableDatabase()
C、getDatabase() D、getAbleDatabase()

下列對SharePreferences存、取文件的說法中正確的是:abd
A,屬於移動存儲解決方案 B,sharePreferences處理的就是key-value對
C,讀取xml文件的路徑是/sdcard/shared_prefx D,信息的保存格式是xml

NotificationManager中清除消息的方法是 bd
A,destroy B,cancel C,clear D,cancelAll

Ⅵ 用prim演算法求最小生成樹:c語言

把main函數抄改成:

main(){
GraphMatrix graph = {
"abcd",

{{7,8,Max,15},{12,100,6,20},{Max,100,4,13},{Max,4,8,10}},

};

Edge mst[Max];
int i,j;

prim(graph,mst);
for(j=0;j<Max;j++)
{
printf("%c\t",mst[j].stop_vex);
printf("%c\t",mst[j].start_vex);
printf("%d\n",mst[j].weight);
}
}

還有襲GraphMatrix結構體里的vexs數組最好定義為vexs[VN+1]給字元串末尾的『\0'留地方。

Ⅶ C語言prim最小生成樹問題 調試無提示錯誤,但運行到 PRIM中輸出那一步就運行不了了,求大神解答~

運行不下去了?你看一下這一行代碼的變數值,是不是k的值超過了數組范圍,又或close[k-1]超范圍了?

Ⅷ 關於PRIM演算法求最小生成樹的問題(c語言版)

/*
鄰接矩陣存儲圖
測試數據
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
*/

#include <stdio.h>
#include <limits.h>
#define N 100

int p[N], key[N], tb[N][N];

void prim(int v, int n)
{
int i, j;
int min;

for (i = 1; i <= n; i++)
{
p[i] = v;
key[i] = tb[v][i];
}
key[v] = 0;
for (i = 2; i <= n; i++)
{
min = INT_MAX;
for (j = 1; j <= n; j++)
if (key[j] > 0 && key[j] < min)
{
v = j;
min = key[j];
}
printf("%d%d ", p[v], v);
key[v] = 0;
for (j = 1; j <= n; j++)
if (tb[v][j] < key[j])
p[j] = v, key[j] = tb[v][j];
}
}

int main()
{
int n, m;
int i, j;
int u, v, w;
while (scanf("%d%d", &n, &m))
{
for(i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
tb[i][j] = INT_MAX;
}

while (m--)
{
scanf("%d%d%d", &u, &v, &w);
tb[u][v] = tb[v][u] = w;
}
prim(1, n);
printf("\n");
}
return 0;
}

要求出所有的最小生成樹。。貌似有點麻煩。。

Ⅸ C語言(關於圖最小生成樹方法)

/*
鄰接矩陣存儲圖
測試數據
610
126
131
145
235
253
345
356
364
462
566
*/

#include<stdio.h>
#include<limits.h>
#defineN100

intp[N],key[N],tb[N][N];

voidprim(intv,intn)
{
inti,j;
intmin;

for(i=1;i<=n;i++)
{
p[i]=v;
key[i]=tb[v][i];
}
key[v]=0;
for(i=2;i<=n;i++)
{
min=INT_MAX;
for(j=1;j<=n;j++)
if(key[j]>0&&key[j]<min)
{
v=j;
min=key[j];
}
printf("%d%d",p[v],v);
key[v]=0;
for(j=1;j<=n;j++)
if(tb[v][j]<key[j])
p[j]=v,key[j]=tb[v][j];
}
}

intmain()
{
intn,m;
inti,j;
intu,v,w;
while(scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
tb[i][j]=INT_MAX;
}

while(m--)
{
scanf("%d%d%d",&u,&v,&w);
tb[u][v]=tb[v][u]=w;
}
prim(1,n);
printf(" ");
}
return0;
}