zoukankan      html  css  js  c++  java
  • 多源最短路

    Stockbroker Grapevine http://poj.org/problem?id=1125

    模板题

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int inf=0x3f3f3ff;
     5 const int M=128;
     6 class Floyd{///多源最短路o(MV^3)
     7     typedef int typec;///边权的类型
     8     static const int MV=128;///点的个数
     9     int n,i,j,k;
    10     typec mat[MV][MV];
    11 public:
    12     void init(int tn){///传入点的个数,下标0开始
    13         n=tn;
    14         for(i=0;i<n;i++)
    15             for(j=0;j<n;j++)
    16                 mat[i][j]=i==j?0:inf;
    17     }
    18     void add(int u,int v,typec w){
    19         mat[u][v]=min(mat[u][v],w);
    20     }
    21     void solve(){
    22         for(k=0; k<n; k++)
    23             for(i=0; i<n; i++)
    24                 for(j=0; j<n; j++)
    25                     mat[i][j]=min(mat[i][j],mat[i][k]+mat[k][j]);
    26     }
    27     typec getdist(int x,int y) {
    28         return mat[x][y];
    29     }
    30 }gx;
    31 int main() {
    32     int n,m,x,y;
    33     while(~scanf("%d",&n),n) {
    34         gx.init(n);
    35         for(int i=0; i<n; i++) {
    36             scanf("%d",&m);
    37             while(m--) {
    38                 scanf("%d%d",&x,&y);
    39                 gx.add(i,x-1,y);
    40             }
    41         }
    42         gx.solve();
    43         int sma=inf;
    44         int id;
    45         for(int i=0; i<n; i++) {
    46             int sum=0;
    47             for(int j=0; j<n; j++) {
    48                 sum+=gx.getdist(i,j);
    49             }
    50             if(sma>sum) {
    51                 sma=sum;
    52                 id=i;
    53             }
    54         }
    55         int big=0;
    56         for(int i=0; i<n; i++) {
    57             big=max(big,gx.getdist(id,i));
    58         }
    59         printf("%d %d
    ",id+1,big);
    60     }
    61     return 0;
    62 }
    View Code

    MPI Maelstrom http://poj.org/problem?id=1502

    多源解单源

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int inf=0x3f3f3f3f;
     5 class Floyd { ///多源最短路o(MV^3)
     6     typedef int typec;///边权的类型
     7     static const int MV=128;///点的个数
     8     int n,i,j,k;
     9     typec mat[MV][MV];
    10 public:
    11     void init(int tn) { ///传入点的个数,下标0开始
    12         n=tn;
    13         for(i=0; i<n; i++)
    14             for(j=0; j<n; j++)
    15                 mat[i][j]=i==j?0:inf;
    16     }
    17     void add(int u,int v,typec w) {
    18         mat[u][v]=min(mat[u][v],w);
    19     }
    20     void solve() {
    21         for(k=0; k<n; k++)
    22             for(i=0; i<n; i++)
    23                 for(j=0; j<n; j++)
    24                     mat[i][j]=min(mat[i][j],mat[i][k]+mat[k][j]);
    25     }
    26     typec getdist(int x,int y) {
    27         return mat[x][y];
    28     }
    29 }gx;
    30 int main() {
    31     int n;
    32     char tmp[32];
    33     while(~scanf("%d",&n)) {
    34         gx.init(n);
    35         for(int i=2; i<=n; i++) {
    36             for(int j=1; j<i; j++) {
    37                 scanf("%s",tmp);
    38                 if(tmp[0]=='x') {
    39                     continue;
    40                 }
    41                 int sum=0;
    42                 for(int k=0; tmp[k]; k++) {
    43                     sum*=10;
    44                     sum+=tmp[k]-'0';
    45                 }
    46                 gx.add(i-1,j-1,sum);
    47                 gx.add(j-1,i-1,sum);
    48             }
    49         }
    50         gx.solve();
    51         int ans=0;
    52         for(int i=0; i<n; i++) {
    53             ans=max(ans,gx.getdist(0,i));
    54         }
    55         printf("%d
    ",ans);
    56     }
    57     return 0;
    58 }
    View Code

    Tram http://poj.org/problem?id=1847

     多源解单源

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include<stack>
     5 #include<algorithm>
     6 #define mt(a,b) memset(a,b,sizeof(a))
     7 using namespace std;
     8 typedef __int64 LL;
     9 const int inf=0x3f3f3f3f;
    10 class Floyd { ///多源最短路o(MV^3)
    11     typedef int typec;///边权的类型
    12     static const int MV=128;///点的个数
    13     int n,i,j,k;
    14     typec mat[MV][MV];
    15 public:
    16     void init(int tn) { ///传入点的个数,下标0开始
    17         n=tn;
    18         for(i=0; i<n; i++)
    19             for(j=0; j<n; j++)
    20                 mat[i][j]=i==j?0:inf;
    21     }
    22     void add(int u,int v,typec w) {
    23         mat[u][v]=min(mat[u][v],w);
    24     }
    25     void solve() {
    26         for(k=0; k<n; k++)
    27             for(i=0; i<n; i++)
    28                 for(j=0; j<n; j++)
    29                     mat[i][j]=min(mat[i][j],mat[i][k]+mat[k][j]);
    30     }
    31     typec getdist(int x,int y) {
    32         return mat[x][y];
    33     }
    34 }gx;
    35 int main(){
    36     int n,a,b;
    37     while(~scanf("%d%d%d",&n,&a,&b)){
    38         gx.init(n);
    39         for(int i=1;i<=n;i++){
    40             int m,to;
    41             scanf("%d",&m);
    42             for(int j=0;j<m;j++){
    43                 scanf("%d",&to);
    44                 if(j!=0)    gx.add(i-1,to-1,1);
    45                 else        gx.add(i-1,to-1,0);
    46             }
    47         }
    48         gx.solve();
    49         int ans=gx.getdist(a-1,b-1);
    50         if(ans>1024) ans=-1;
    51         printf("%d
    ",ans);
    52     }
    53     return 0;
    54 }
    View Code

     Subway http://poj.org/problem?id=2502

      多源解单源

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<queue>
     5 #include<stack>
     6 #include<algorithm>
     7 #define mt(a,b) memset(a,b,sizeof(a))
     8 using namespace std;
     9 typedef __int64 LL;
    10 const int inf=0x3f3f3f3f;
    11 const int M=210;
    12 class Floyd { ///多源最短路o(MV^3)
    13     typedef double typec;///边权的类型
    14     static const int MV=M;///点的个数
    15     int n,i,j,k;
    16     typec mat[MV][MV];
    17 public:
    18     void init(int tn) { ///传入点的个数,下标0开始
    19         n=tn;
    20         for(i=0; i<n; i++)
    21             for(j=0; j<n; j++)
    22                 mat[i][j]=i==j?0:inf;
    23     }
    24     void add(int u,int v,typec w) {
    25         mat[u][v]=min(mat[u][v],w);
    26     }
    27     void solve() {
    28         for(k=0; k<n; k++)
    29             for(i=0; i<n; i++)
    30                 for(j=0; j<n; j++)
    31                     mat[i][j]=min(mat[i][j],mat[i][k]+mat[k][j]);
    32     }
    33     typec getdist(int x,int y) {
    34         return mat[x][y];
    35     }
    36 }gx;
    37 struct point{
    38     double x,y;
    39 }p[M];
    40 double a[M][M];
    41 int main() {
    42     int i,j,c,flag=0;
    43     scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
    44     int n=2;
    45     while(~scanf("%lf%lf",&p[n].x,&p[n].y)) {
    46         if(p[n].x==-1&&p[n].y==-1) {
    47             flag=0;
    48             continue;
    49         }
    50         if(flag) {
    51             a[n][n-1]=sqrt((p[n].x-p[n-1].x)*(p[n].x-p[n-1].x)+(p[n].y-p[n-1].y)*(p[n].y-p[n-1].y))/40000.0;
    52             a[n-1][n]=a[n][n-1];
    53         }
    54         n++;
    55         flag=1;
    56     }
    57     for(i=0; i<n; i++) {
    58         for(j=0; j<n; j++) {
    59             if(i!=j&&a[i][j]==0.0) {
    60                 a[i][j]=sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y))/10000.0;
    61             }
    62         }
    63     }
    64     gx.init(n);
    65     for(i=0;i<n;i++){
    66         for(j=0;j<n;j++){
    67             gx.add(i,j,a[i][j]);
    68         }
    69     }
    70     gx.solve();
    71     printf("%0.0f
    ",60.0*gx.getdist(0,1));
    72     return 0;
    73 }
    View Code

    end

  • 相关阅读:
    C语言第十一讲,预处理命令.
    C语言第十讲,枚举类型简单说明
    C语言第九讲,结构体
    C语言第八讲,指针*
    C语言第七讲,函数入门.
    C语言第六讲,数组
    C语言第五讲,语句 顺序循环选择.
    C语言第四讲,typedef 关键字,以及作用域
    C语言第三讲,基本数据类型
    64位内核第二讲,进程保护之对象钩子
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/3952283.html
Copyright © 2011-2022 走看看