poj-3268-Silver Cow Party dijkstra模板题

来源:互联网 发布:淘宝店铺整体模块介绍 编辑:程序博客网 时间:2024/06/06 16:35

第一遍dijkstar(求终点到起点的最短路)
第二遍dijkstra 权值反转(把mp[i][j]和mp[j][i]交换)(求各起点到终点的最短路)
水水水水水~~~~~

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int ans[1005],dis[1005],mp[1005][1005],n,m,en,a,b,len;bool sym[1005];void dijkstra(){   memset(sym,0,sizeof(sym));   for(int i=1;i<=n;i++)     dis[i] = 999999999;   sym[en] = 1;   dis[en] = 0;   int pre = en;   for(int i=1;i<=n;i++)    if(!sym[i]&&dis[i]>dis[pre]+mp[pre][i])dis[i] = dis[pre]+mp[pre][i];   for(int i=2;i<=n;i++)   {       int ma = 999999999;      for(int j=1;j<=n;j++)        if(!sym[j]&&dis[j]<ma)      {          pre = j;          ma =dis[j];      }      sym[pre] = 1;    for(int j=1;j<=n;j++)     if(!sym[j]&&dis[j]>dis[pre]+mp[pre][j])dis[j] = dis[pre]+mp[pre][j];   }   for(int i=1;i<=n;i++)    ans[i]+=dis[i];}int main(){    while(scanf("%d%d%d",&n,&m,&en)!=EOF)    {        memset(ans,0,sizeof(ans));       for(int i=1;i<=n;i++)         for(int j=1;j<=n;j++)           mp[i][j] = 999999999;       while(m--)       {           scanf("%d%d%d",&a,&b,&len);           if(mp[a][b]>len)mp[a][b] = len;       }       dijkstra();       for(int i=1;i<=n;i++)        for(int j=i;j<=n;j++)       {           int t = mp[i][j];           mp[i][j] = mp[j][i];           mp[j][i] = t;       }       dijkstra();       int ans1 = 0;       for(int i=1;i<=n;i++)         ans1 = max(ans1,ans[i]);       printf("%d\n",ans1);    }    return 0;}
0 0
原创粉丝点击