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;   } 



原创粉丝点击