dijkstra算法典型题
来源:互联网 发布:翻译英语的软件 编辑:程序博客网 时间:2024/06/04 19:05
//toj1778--dijkstra加上dp#include<iostream>#include<memory.h>#define INF 0xfffffff#define MAX 105using namespace std;int flag[MAX],map[MAX][MAX],dist[MAX],dp[MAX];int i,j,n;void dijkstra(int s){ memset(flag,0,sizeof(flag)); for(i=1;i<=n;i++) if(map[s][i]!=0) dist[i]=map[s][i]; else dist[i]=INF; dist[s]=0; flag[s]=1; for(i=1;i<n;i++) { int min=INF; for(j=1;j<=n;j++) if(flag[j]==0&&dist[j]<min) { min=dist[s=j]; //tmp=j; } flag[s]=1; //if(tmp==-1) return; for(j=1;j<=n;j++) if(flag[j]==0&&dist[j]>dist[s]+map[s][j]&&map[s][j]!=0) dist[j]=dist[s]+map[s][j]; } }int dfs(int u){ if(dp[u]!=-1)return dp[u]; dp[u]=0; for(int i=1;i<=n;i++) if(map[u][i]!=0&&dist[i]<dist[u]) dp[u]+=dfs(i); return dp[u]; }int main(){ int m,a,b,c; while(cin>>n) { if(n==0)break; memset(map,0,sizeof(map)); //初始化dp memset(dp,-1,sizeof(dp)); cin>>m; for(i=0;i<m;i++) { cin>>a>>b>>c; map[a][b]=map[b][a]=c; } dijkstra(2); //dfs dp[2]=1; dfs(1); cout<<dp[1]<<endl; } return 0; }
//toj 2870 the k-th city#include<iostream>#define MAX 202#define INF 0xfffffff//16进制的无符号数0xfffffff是最大的int(整数)using namespace std;int map[MAX][MAX];int dijkstra(int n,int s,int k){ int i,j,dist[MAX],flag[MAX]; for (i=0;i<n;i++) { dist[i]=map[s][i]; flag[i]=0; } dist[0]=0; for(i=0;i<n;i++) { int min=INF,tmp=0; for(j=0;j<n;j++) if(flag[j]==0&&min>dist[j]) { min=dist[j]; tmp=j; } flag[tmp]=1; if(i==k)return tmp; for(j=0;j<n;j++) if(flag[j]==0&&dist[j]>map[tmp][j]+dist[tmp]) dist[j]=map[tmp][j]+dist[tmp]; } }int main(){ int i,j,a,b,c,m,n,k; while(cin>>n) { if(n==0)break; cin>>m; for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]=INF; for(i=0;i<m;i++) { cin>>a>>b>>c; map[a][b]=map[b][a]=c; } cin>>k; cout<<dijkstra(n,0,k)<<endl; } return 0; }