• 单源最短路


    http://poj.org/problem?id=3013

    dij priority queue 

      1 #include<cstdio>
      2 #include<queue>
      3 using namespace std;
      4 typedef __int64 LL;
      5 const LL inf=0x3f3f3f3f3f3f3f3fLL;
      6 class Dijkstra { ///单源最短路 o(ME*log(MV))
      7     typedef LL typec;///边权的类型
      8     static const int ME=1e5+10;///边的个数
      9     static const int MV=5e4+10;///点的个数
     10     struct Q {
     11         int id;
     12         typec w;
     13         friend bool operator <(const Q &a,const Q &b) {
     14             return a.w>b.w;
     15         }
     16     } now;
     17     priority_queue<Q> q;
     18     struct E {
     19         int v,next;
     20         typec w;
     21     } e[ME];
     22     int n,le,head[MV],u,v,i;
     23     typec dist[MV],w;
     24     bool used[MV];
     25 public:
     26     void init(int tn) {///传入点的个数
     27         n=tn;
     28         le=0;
     29         for(i=0; i<=n; i++) head[i]=-1;
     30     }
     31     void add(int u,int v,typec w) {
     32         e[le].v=v;
     33         e[le].w=w;
     34         e[le].next=head[u];
     35         head[u]=le++;
     36     }
     37     void solve(int s) {///传入起点
     38         for(i=0; i<=n; i++) {
     39             used[i]=true;
     40             dist[i]=inf;
     41         }
     42         dist[s]=0;
     43         now.id=s;
     44         now.w=0;
     45         while(!q.empty()) q.pop();
     46         q.push(now);
     47         while(!q.empty()) {
     48             now=q.top();
     49             q.pop();
     50             u=now.id;
     51             if(used[u]) {
     52                 used[u]=false;
     53                 for(i=head[u]; ~i; i=e[i].next) {
     54                     v=e[i].v;
     55                     w=e[i].w;
     56                     if(used[v]&&dist[v]>w+dist[u]) {
     57                         dist[v]=w+dist[u];
     58                         now.id=v;
     59                         now.w=dist[v];
     60                         q.push(now);
     61                     }
     62                 }
     63             }
     64         }
     65     }
     66     typec getdist(int id) {
     67         return dist[id];
     68     }
     69 } g;
     70 int val[50010];
     71 int main(){
     72     int t,n,m,u,v,w;
     73     while(~scanf("%d",&t)){
     74         while(t--){
     75             scanf("%d%d",&n,&m);
     76             for(int i=1;i<=n;i++){
     77                 scanf("%d",&val[i]);
     78             }
     79             g.init(n);
     80             while(m--){
     81                 scanf("%d%d%d",&u,&v,&w);
     82                 g.add(u,v,w);
     83                 g.add(v,u,w);
     84             }
     85             g.solve(1);
     86             bool flag=true;
     87             LL sum=0;
     88             for(int i=1;i<=n;i++){
     89                 if(g.getdist(i)==inf){
     90                     flag=false;
     91                     break;
     92                 }
     93                 sum+=g.getdist(i)*val[i];
     94             }
     95             if(!flag){
     96                 puts("No Answer");
     97             }
     98             else{
     99                 printf("%I64d
    ",sum);
    100             }
    101         }
    102     }
    103     return 0;
    104 }
    View Code

     spfa

     1 #include<cstdio>
     2 #include<queue>
     3 using namespace std;
     4 typedef __int64 LL;
     5 const LL inf=0x3f3f3f3f3f3f3f3fLL;
     6 class Spfa { ///单源最短路o(k*ME)k~=2
     7     typedef LL typec;///边权的类型
     8     static const int ME=1e5+10;///边的个数
     9     static const int MV=5e4+10;///点的个数
    10     struct E {
    11         int v,next;
    12         typec w;
    13     } e[ME];
    14     int n,le,head[MV],inque[MV],i,u,v;
    15     typec dist[MV];
    16     bool used[MV];
    17     queue<int> q;
    18 public:
    19     void init(int tn) { ///传入点的个数
    20         n=tn;
    21         le=0;
    22         for(i=0; i<=n; i++) head[i]=-1;
    23     }
    24     void add(int u,int v,typec w) {
    25         e[le].v=v;
    26         e[le].w=w;
    27         e[le].next=head[u];
    28         head[u]=le++;
    29     }
    30     bool solve(int s) { ///传入起点,存在负环返回false
    31         for(i=0; i<=n; i++) {
    32             dist[i]=inf;
    33             used[i]=true;
    34             inque[i]=0;
    35         }
    36         used[s]=false;
    37         dist[s]=0;
    38         inque[s]++;
    39         while(!q.empty()) q.pop();
    40         q.push(s);
    41         while(!q.empty()) {
    42             u=q.front();
    43             q.pop();
    44             used[u]=true;
    45             for(i=head[u]; ~i; i=e[i].next) {
    46                 v=e[i].v;
    47                 if(dist[v]>dist[u]+e[i].w) {
    48                     dist[v]=dist[u]+e[i].w;
    49                     if(used[v]) {
    50                         used[v]=false;
    51                         q.push(v);
    52                         inque[v]++;
    53                         if(inque[v]>n) return false;
    54                     }
    55                 }
    56             }
    57         }
    58         return true;
    59     }
    60     typec getdist(int id) {
    61         return dist[id];
    62     }
    63 } g;
    64 
    65 int val[50010];
    66 int main(){
    67     int t,n,m,u,v,w;
    68     while(~scanf("%d",&t)){
    69         while(t--){
    70             scanf("%d%d",&n,&m);
    71             for(int i=1;i<=n;i++){
    72                 scanf("%d",&val[i]);
    73             }
    74             g.init(n);
    75             while(m--){
    76                 scanf("%d%d%d",&u,&v,&w);
    77                 g.add(u,v,w);
    78                 g.add(v,u,w);
    79             }
    80             g.solve(1);
    81             bool flag=true;
    82             LL sum=0;
    83             for(int i=1;i<=n;i++){
    84                 if(g.getdist(i)==inf){
    85                     flag=false;
    86                     break;
    87                 }
    88                 sum+=g.getdist(i)*val[i];
    89             }
    90             if(!flag){
    91                 puts("No Answer");
    92             }
    93             else{
    94                 printf("%I64d
    ",sum);
    95             }
    96         }
    97     }
    98     return 0;
    99 }
    View Code

    Invitation Cards  http://poj.org/problem?id=1511

    dij+priority queue  o (elogv)

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 #define mt(a,b) memset(a,b,sizeof(a))
      5 using namespace std;
      6 typedef long long LL;
      7 const int inf=0x3f3f3f3f;
      8 class Dijkstra { ///单源最短路 o(ME*log(MV))
      9     typedef int typec;///边权的类型
     10     static const int ME=1e6+10;///边的个数
     11     static const int MV=1e6+10;///点的个数
     12     struct Q {
     13         int id;
     14         typec w;
     15         friend bool operator <(const Q &a,const Q &b) {
     16             return a.w>b.w;
     17         }
     18     } now;
     19     priority_queue<Q> q;
     20     struct E {
     21         int v,next;
     22         typec w;
     23     } e[ME];
     24     int n,le,head[MV];
     25     typec dist[MV];
     26     bool used[MV];
     27 public:
     28     void init(int tn) {///传入点的个数
     29         n=tn;
     30         le=0;
     31         mt(head,-1);
     32     }
     33     void add(int u,int v,typec w) {
     34         e[le].v=v;
     35         e[le].w=w;
     36         e[le].next=head[u];
     37         head[u]=le++;
     38     }
     39     void solve(int s) {///传入起点
     40         for(int i=0; i<=n; i++) {
     41             used[i]=true;
     42             dist[i]=inf;
     43         }
     44         dist[s]=0;
     45         now.id=s;
     46         now.w=0;
     47         while(!q.empty()) q.pop();
     48         q.push(now);
     49         while(!q.empty()) {
     50             now=q.top();
     51             q.pop();
     52             int u=now.id;
     53             if(used[u]) {
     54                 used[u]=false;
     55                 for(int i=head[u]; ~i; i=e[i].next) {
     56                     int v=e[i].v;
     57                     typec w=e[i].w;
     58                     if(used[v]&&dist[v]>w+dist[u]) {
     59                         dist[v]=w+dist[u];
     60                         now.id=v;
     61                         now.w=dist[v];
     62                         q.push(now);
     63                     }
     64                 }
     65             }
     66         }
     67     }
     68     typec getdist(int id) {
     69         return dist[id];
     70     }
     71 } gx;
     72 struct IN{
     73     int u,v,w;
     74 }e[1000010];
     75 int main() {
     76     int t,n,m,u,v,w;
     77     while(~scanf("%d",&t)) {
     78         while(t--) {
     79             scanf("%d%d",&n,&m);
     80             gx.init(n);
     81             for(int i=0;i<m;i++) {
     82                 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
     83                 gx.add(e[i].u,e[i].v,e[i].w);
     84             }
     85             gx.solve(1);
     86             LL ans=0;
     87             for(int i=1; i<=n; i++) {
     88                 ans+=gx.getdist(i);
     89             }
     90             gx.init(n);
     91             for(int i=0;i<m;i++){
     92                 gx.add(e[i].v,e[i].u,e[i].w);
     93             }
     94             gx.solve(1);
     95             for(int i=1; i<=n; i++) {
     96                 ans+=gx.getdist(i);
     97             }
     98             printf("%lld
    ",ans);
     99         }
    100     }
    101     return 0;
    102 }
    View Code

    spfa o(2e)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #define mt(a,b) memset(a,b,sizeof(a))
     5 using namespace std;
     6 typedef __int64 LL;
     7 const int inf=0x3f3f3f3f;
     8 const int M=1000010;
     9 class Spfa { ///单源最短路o(k*ME)k~=2
    10     typedef int typec;///边权的类型
    11     static const int ME=1e6+10;///边的个数
    12     static const int MV=1e6+10;///点的个数
    13     struct E {
    14         int v,next;
    15         typec w;
    16     } e[ME];
    17     int n,le,head[MV],inque[MV],i,u,v;
    18     typec dist[MV];
    19     bool used[MV];
    20     queue<int> q;
    21 public:
    22     void init(int tn) { ///传入点的个数
    23         n=tn;
    24         le=0;
    25         for(i=0;i<=n;i++) head[i]=-1;
    26     }
    27     void add(int u,int v,typec w) {
    28         e[le].v=v;
    29         e[le].w=w;
    30         e[le].next=head[u];
    31         head[u]=le++;
    32     }
    33     bool solve(int s) { ///传入起点,存在负环返回false
    34         for(i=0; i<=n; i++) {
    35             dist[i]=inf;
    36             used[i]=true;
    37             inque[i]=0;
    38         }
    39         used[s]=false;
    40         dist[s]=0;
    41         inque[s]++;
    42         while(!q.empty()) q.pop();
    43         q.push(s);
    44         while(!q.empty()) {
    45             u=q.front();
    46             q.pop();
    47             used[u]=true;
    48             for(i=head[u]; ~i; i=e[i].next) {
    49                 v=e[i].v;
    50                 if(dist[v]>dist[u]+e[i].w) {
    51                     dist[v]=dist[u]+e[i].w;
    52                     if(used[v]) {
    53                         used[v]=false;
    54                         q.push(v);
    55                         inque[v]++;
    56                         if(inque[v]>n) return false;
    57                     }
    58                 }
    59             }
    60         }
    61         return true;
    62     }
    63     typec getdist(int id) {
    64         return dist[id];
    65     }
    66 } gx;
    67 struct IN {
    68     int u,v,w;
    69 } e[M];
    70 int main() {
    71     int t,n,m,u,v,w;
    72     while(~scanf("%d",&t)) {
    73         while(t--) {
    74             scanf("%d%d",&n,&m);
    75             gx.init(n);
    76             for(int i=0; i<m; i++) {
    77                 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    78                 gx.add(e[i].u,e[i].v,e[i].w);
    79             }
    80             gx.solve(1);
    81             LL ans=0;
    82             for(int i=1; i<=n; i++) {
    83                 ans+=gx.getdist(i);
    84             }
    85             gx.init(n);
    86             for(int i=0; i<m; i++) {
    87                 gx.add(e[i].v,e[i].u,e[i].w);
    88             }
    89             gx.solve(1);
    90             for(int i=1; i<=n; i++) {
    91                 ans+=gx.getdist(i);
    92             }
    93             printf("%I64d
    ",ans);
    94         }
    95     }
    96     return 0;
    97 }
    View Code

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

    dij+priority queue  o (elogv)

      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 Dijkstra { ///单源最短路 o(ME*log(MV))
     11     typedef int typec;///边权的类型
     12     static const int ME=1e4+10;///边的个数
     13     static const int MV=1e2+10;///点的个数
     14     struct Q {
     15         int id;
     16         typec w;
     17         friend bool operator <(const Q &a,const Q &b) {
     18             return a.w>b.w;
     19         }
     20     } now;
     21     priority_queue<Q> q;
     22     struct E {
     23         int v,next;
     24         typec w;
     25     } e[ME];
     26     int n,le,head[MV],u,v,i;
     27     typec dist[MV],w;
     28     bool used[MV];
     29 public:
     30     void init(int tn) {///传入点的个数
     31         n=tn;
     32         le=0;
     33         mt(head,-1);
     34     }
     35     void add(int u,int v,typec w) {
     36         e[le].v=v;
     37         e[le].w=w;
     38         e[le].next=head[u];
     39         head[u]=le++;
     40     }
     41     void solve(int s) {///传入起点
     42         for(i=0; i<=n; i++) {
     43             used[i]=true;
     44             dist[i]=inf;
     45         }
     46         dist[s]=0;
     47         now.id=s;
     48         now.w=0;
     49         while(!q.empty()) q.pop();
     50         q.push(now);
     51         while(!q.empty()) {
     52             now=q.top();
     53             q.pop();
     54             u=now.id;
     55             if(used[u]) {
     56                 used[u]=false;
     57                 for(i=head[u]; ~i; i=e[i].next) {
     58                     v=e[i].v;
     59                     w=e[i].w;
     60                     if(used[v]&&dist[v]>w+dist[u]) {
     61                         dist[v]=w+dist[u];
     62                         now.id=v;
     63                         now.w=dist[v];
     64                         q.push(now);
     65                     }
     66                 }
     67             }
     68         }
     69     }
     70     typec getdist(int id) {
     71         return dist[id];
     72     }
     73 } gx;
     74 int main(){
     75     int n;
     76     char tmp[32];
     77     while(~scanf("%d",&n)){
     78         gx.init(n);
     79         for(int i=2;i<=n;i++){
     80             for(int j=1;j<i;j++){
     81                 scanf("%s",tmp);
     82                 if(tmp[0]=='x'){
     83                     continue;
     84                 }
     85                 int sum=0;
     86                 for(int k=0;tmp[k];k++){
     87                     sum*=10;
     88                     sum+=tmp[k]-'0';
     89                 }
     90                 gx.add(i,j,sum);
     91                 gx.add(j,i,sum);
     92             }
     93         }
     94         gx.solve(1);
     95         int ans=0;
     96         for(int i=1;i<=n;i++){
     97             ans=max(ans,gx.getdist(i));
     98         }
     99         printf("%d
    ",ans);
    100     }
    101     return 0;
    102 }
    View Code

     dij n^2

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int inf=0x3f3f3f3f;
     5 class Dijkstra_Matrix { ///单源最短路 (邻接阵)o(MV^2)
     6     typedef int typec;///边权的类型
     7     static const int MV=1e2+10;///点的个数
     8     int n,pre[MV],i,j,k;
     9     typec mat[MV][MV],dist[MV];
    10     bool vis[MV];
    11 public:
    12     void init(int tn) { ///传入点的个数
    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(int s) { ///传入起点
    22         for(i=0; i<=n; i++) {
    23             dist[i]=inf;
    24             vis[i]=false;
    25             pre[i]=-1;
    26         }
    27         for(dist[s]=0,j=0; j<=n; j++) {
    28             for(k=-1,i=0; i<=n; i++) {
    29                 if(!vis[i]&&(k==-1||dist[i]<dist[k])) {
    30                     k=i;
    31                 }
    32             }
    33             for(vis[k]=true,i=0; i<=n; i++) {
    34                 if(!vis[i]&&dist[k]+mat[k][i]<dist[i]) {
    35                     dist[i]=dist[k]+mat[pre[i]=k][i];
    36                 }
    37             }
    38         }
    39     }
    40     typec getdist(int id) {
    41         return dist[id];
    42     }
    43 } gx;
    44 int main() {
    45     int n;
    46     char tmp[32];
    47     while(~scanf("%d",&n)) {
    48         gx.init(n);
    49         for(int i=2; i<=n; i++) {
    50             for(int j=1; j<i; j++) {
    51                 scanf("%s",tmp);
    52                 if(tmp[0]=='x') {
    53                     continue;
    54                 }
    55                 int sum=0;
    56                 for(int k=0; tmp[k]; k++) {
    57                     sum*=10;
    58                     sum+=tmp[k]-'0';
    59                 }
    60                 gx.add(i,j,sum);
    61                 gx.add(j,i,sum);
    62             }
    63         }
    64         gx.solve(1);
    65         int ans=0;
    66         for(int i=1; i<=n; i++) {
    67             ans=max(ans,gx.getdist(i));
    68         }
    69         printf("%d
    ",ans);
    70     }
    71     return 0;
    72 }
    View Code

    spfa o(2e)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<queue>
     5 #define mt(a,b) memset(a,b,sizeof(a))
     6 using namespace std;
     7 const int inf=0x3f3f3f3f;
     8 class Spfa { ///单源最短路o(2*ME)
     9     typedef int typec;///边权的类型
    10     static const int ME=1000010;///边的个数
    11     static const int MV=1000010;///点的个数
    12     struct E {
    13         int v,next;
    14         typec w;
    15     } e[ME];
    16     int n,le,head[MV],inque[MV];
    17     typec dist[MV];
    18     bool used[MV];
    19     queue<int> q;
    20 public:
    21     void init(int tn) { ///传入点的个数
    22         n=tn;
    23         le=0;
    24         mt(head,-1);
    25     }
    26     void add(int u,int v,typec w) {
    27         e[le].v=v;
    28         e[le].w=w;
    29         e[le].next=head[u];
    30         head[u]=le++;
    31     }
    32     bool solve(int s) { ///传入起点,下标0开始,存在负环返回false
    33         for(int i=0; i<n; i++) {
    34             dist[i]=inf;
    35             used[i]=true;
    36             inque[i]=0;
    37         }
    38         used[s]=false;
    39         dist[s]=0;
    40         inque[s]++;
    41         while(!q.empty()) q.pop();
    42         q.push(s);
    43         while(!q.empty()) {
    44             int u=q.front();
    45             q.pop();
    46             used[u]=true;
    47             for(int i=head[u]; ~i; i=e[i].next) {
    48                 int v=e[i].v;
    49                 if(dist[v]>dist[u]+e[i].w) {
    50                     dist[v]=dist[u]+e[i].w;
    51                     if(used[v]) {
    52                         used[v]=false;
    53                         q.push(v);
    54                         inque[v]++;
    55                         if(inque[v]>n) return false;
    56                     }
    57                 }
    58             }
    59         }
    60         return true;
    61     }
    62     typec getdist(int id) {
    63         return dist[id];
    64     }
    65 } gx;
    66 int main() {
    67     int n;
    68     char tmp[32];
    69     while(~scanf("%d",&n)) {
    70         gx.init(n);
    71         for(int i=2; i<=n; i++) {
    72             for(int j=1; j<i; j++) {
    73                 scanf("%s",tmp);
    74                 if(tmp[0]=='x') {
    75                     continue;
    76                 }
    77                 int sum=0;
    78                 for(int k=0; tmp[k]; k++) {
    79                     sum*=10;
    80                     sum+=tmp[k]-'0';
    81                 }
    82                 gx.add(i-1,j-1,sum);
    83                 gx.add(j-1,i-1,sum);
    84             }
    85         }
    86         gx.solve(0);
    87         int ans=0;
    88         for(int i=0; i<n; i++) {
    89             ans=max(ans,gx.getdist(i));
    90         }
    91         printf("%d
    ",ans);
    92     }
    93     return 0;
    94 }
    View Code

     bell ford ve

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<queue>
      5 #define mt(a,b) memset(a,b,sizeof(a))
      6 using namespace std;
      7 const int inf=0x3f3f3f3f;
      8 class Bellman_ford { ///单源最短路o(MV*ME)
      9     typedef int typec;///边权的类型
     10     static const int ME=1000010;///边的个数
     11     static const int MV=1000010;///点的个数
     12     struct E {
     13         int u,v,next;
     14         typec w;
     15     } e[ME];
     16     int n,le,head[MV];
     17     bool used[MV];
     18     typec dist[MV];
     19 public:
     20     void init(int tn) { ///传入点的个数
     21         n=tn;
     22         le=0;
     23         mt(head,-1);
     24     }
     25     void add(int u,int v,typec w) {
     26         e[le].u=u;
     27         e[le].v=v;
     28         e[le].w=w;
     29         e[le].next=head[u];
     30         head[u]=le++;
     31     }
     32     bool solve(int s) {  ///传入起点,下标0开始,为真最短路成功,为假存在负环
     33         for(int i=0; i<n; i++) {
     34             used[i]=true;
     35             dist[i]=inf;
     36         }
     37         used[s]=false;
     38         dist[s]=0;
     39         for(int i=head[s]; ~i; i=e[i].next){
     40             int v=e[i].v;
     41             dist[v]=min(dist[v],e[i].w);
     42         }
     43         for(int i=1; i<n; i++) {
     44             typec sma=inf;
     45             int p;
     46             for(int j=0; j<n; j++) {
     47                 if(used[j]&&sma>dist[j]) {
     48                     p=j;
     49                     sma=dist[j];
     50                 }
     51             }
     52             used[p]=false;
     53             for(int j=head[p]; ~j; j=e[j].next) {
     54                 int v=e[j].v;
     55                 if(!used[v]) continue;
     56                 dist[v]=min(dist[v],e[j].w+dist[e[j].u]);
     57             }
     58         }
     59         bool flag=true;
     60         int j;
     61         for(j=0; flag&&j<=n; j++) {
     62             flag=false;
     63             for(int i=0; i<n; i++) {
     64                 for(int k=head[i]; ~k; k=e[k].next) {
     65                     if(dist[e[k].v]>e[k].w+dist[i]) {
     66                         dist[e[k].v]=e[k].w+dist[i];
     67                         flag=true;
     68                     }
     69                 }
     70             }
     71         }
     72         return j<=n;
     73     }
     74     typec getdist(int id){
     75         return dist[id];
     76     }
     77 }gx;
     78 int main() {
     79     int n;
     80     char tmp[32];
     81     while(~scanf("%d",&n)) {
     82         gx.init(n);
     83         for(int i=2; i<=n; i++) {
     84             for(int j=1; j<i; j++) {
     85                 scanf("%s",tmp);
     86                 if(tmp[0]=='x') {
     87                     continue;
     88                 }
     89                 int sum=0;
     90                 for(int k=0; tmp[k]; k++) {
     91                     sum*=10;
     92                     sum+=tmp[k]-'0';
     93                 }
     94                 gx.add(i-1,j-1,sum);
     95                 gx.add(j-1,i-1,sum);
     96             }
     97         }
     98         gx.solve(0);
     99         int ans=0;
    100         for(int i=0; i<n; i++) {
    101             ans=max(ans,gx.getdist(i));
    102         }
    103         printf("%d
    ",ans);
    104     }
    105     return 0;
    106 }
    View Code

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

    dij+priority queue  o (elogv)

     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 Dijkstra { ///单源最短路 o(ME*log(MV))
    11     typedef int typec;///边权的类型
    12     static const int ME=1e4+10;///边的个数
    13     static const int MV=1e2+10;///点的个数
    14     struct Q {
    15         int id;
    16         typec w;
    17         friend bool operator <(const Q &a,const Q &b) {
    18             return a.w>b.w;
    19         }
    20     } now;
    21     priority_queue<Q> q;
    22     struct E {
    23         int v,next;
    24         typec w;
    25     } e[ME];
    26     int n,le,head[MV],u,v,i;
    27     typec dist[MV],w;
    28     bool used[MV];
    29 public:
    30     void init(int tn) {///传入点的个数
    31         n=tn;
    32         le=0;
    33         for(i=0;i<=n;i++) head[i]=-1;
    34     }
    35     void add(int u,int v,typec w) {
    36         e[le].v=v;
    37         e[le].w=w;
    38         e[le].next=head[u];
    39         head[u]=le++;
    40     }
    41     void solve(int s) {///传入起点
    42         for(i=0; i<=n; i++) {
    43             used[i]=true;
    44             dist[i]=inf;
    45         }
    46         dist[s]=0;
    47         now.id=s;
    48         now.w=0;
    49         while(!q.empty()) q.pop();
    50         q.push(now);
    51         while(!q.empty()) {
    52             now=q.top();
    53             q.pop();
    54             u=now.id;
    55             if(used[u]) {
    56                 used[u]=false;
    57                 for(i=head[u]; ~i; i=e[i].next) {
    58                     v=e[i].v;
    59                     w=e[i].w;
    60                     if(used[v]&&dist[v]>w+dist[u]) {
    61                         dist[v]=w+dist[u];
    62                         now.id=v;
    63                         now.w=dist[v];
    64                         q.push(now);
    65                     }
    66                 }
    67             }
    68         }
    69     }
    70     typec getdist(int id) {
    71         return dist[id];
    72     }
    73 } gx;
    74 int main(){
    75     int n,a,b;
    76     while(~scanf("%d%d%d",&n,&a,&b)){
    77         gx.init(n);
    78         for(int i=1;i<=n;i++){
    79             int m,to;
    80             scanf("%d",&m);
    81             for(int j=0;j<m;j++){
    82                 scanf("%d",&to);
    83                 if(j!=0)    gx.add(i,to,1);
    84                 else        gx.add(i,to,0);
    85             }
    86         }
    87         gx.solve(a);
    88         int ans=gx.getdist(b);
    89         if(ans>1024) ans=-1;
    90         printf("%d
    ",ans);
    91     }
    92     return 0;
    93 }
    View Code

     dij n^2

     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 Dijkstra_Matrix { ///单源最短路 (邻接阵)o(MV^2)
    11     typedef int typec;///边权的类型
    12     static const int MV=1e2+10;///点的个数
    13     int n,pre[MV],i,j,k;
    14     typec mat[MV][MV],dist[MV];
    15     bool vis[MV];
    16 public:
    17     void init(int tn) { ///传入点的个数
    18         n=tn;
    19         for(i=0; i<=n; i++)
    20             for(j=0; j<=n; j++)
    21                 mat[i][j]=i==j?0:inf;
    22     }
    23     void add(int u,int v,typec w) {
    24         mat[u][v]=min(mat[u][v],w);
    25     }
    26     void solve(int s) { ///传入起点
    27         for(i=0; i<=n; i++) {
    28             dist[i]=inf;
    29             vis[i]=false;
    30             pre[i]=-1;
    31         }
    32         for(dist[s]=0,j=0; j<=n; j++) {
    33             for(k=-1,i=0; i<=n; i++) {
    34                 if(!vis[i]&&(k==-1||dist[i]<dist[k])) {
    35                     k=i;
    36                 }
    37             }
    38             for(vis[k]=true,i=0; i<=n; i++) {
    39                 if(!vis[i]&&dist[k]+mat[k][i]<dist[i]) {
    40                     dist[i]=dist[k]+mat[pre[i]=k][i];
    41                 }
    42             }
    43         }
    44     }
    45     typec getdist(int id) {
    46         return dist[id];
    47     }
    48 } gx;
    49 int main(){
    50     int n,a,b;
    51     while(~scanf("%d%d%d",&n,&a,&b)){
    52         gx.init(n);
    53         for(int i=1;i<=n;i++){
    54             int m,to;
    55             scanf("%d",&m);
    56             for(int j=0;j<m;j++){
    57                 scanf("%d",&to);
    58                 if(j!=0)    gx.add(i,to,1);
    59                 else        gx.add(i,to,0);
    60             }
    61         }
    62         gx.solve(a);
    63         int ans=gx.getdist(b);
    64         if(ans>1024) ans=-1;
    65         printf("%d
    ",ans);
    66     }
    67     return 0;
    68 }
    View Code

     

    spfa o(2e)

     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 Spfa { ///单源最短路o(2*ME)
    11     typedef int typec;///边权的类型
    12     static const int ME=1000010;///边的个数
    13     static const int MV=1000010;///点的个数
    14     struct E {
    15         int v,next;
    16         typec w;
    17     } e[ME];
    18     int n,le,head[MV],inque[MV];
    19     typec dist[MV];
    20     bool used[MV];
    21     queue<int> q;
    22 public:
    23     void init(int tn) { ///传入点的个数
    24         n=tn;
    25         le=0;
    26         mt(head,-1);
    27     }
    28     void add(int u,int v,typec w) {
    29         e[le].v=v;
    30         e[le].w=w;
    31         e[le].next=head[u];
    32         head[u]=le++;
    33     }
    34     bool solve(int s) { ///传入起点,下标0开始,存在负环返回false
    35         for(int i=0; i<n; i++) {
    36             dist[i]=inf;
    37             used[i]=true;
    38             inque[i]=0;
    39         }
    40         used[s]=false;
    41         dist[s]=0;
    42         inque[s]++;
    43         while(!q.empty()) q.pop();
    44         q.push(s);
    45         while(!q.empty()) {
    46             int u=q.front();
    47             q.pop();
    48             used[u]=true;
    49             for(int i=head[u]; ~i; i=e[i].next) {
    50                 int v=e[i].v;
    51                 if(dist[v]>dist[u]+e[i].w) {
    52                     dist[v]=dist[u]+e[i].w;
    53                     if(used[v]) {
    54                         used[v]=false;
    55                         q.push(v);
    56                         inque[v]++;
    57                         if(inque[v]>n) return false;
    58                     }
    59                 }
    60             }
    61         }
    62         return true;
    63     }
    64     typec getdist(int id) {
    65         return dist[id];
    66     }
    67 } gx;
    68 int main(){
    69     int n,a,b;
    70     while(~scanf("%d%d%d",&n,&a,&b)){
    71         gx.init(n);
    72         for(int i=1;i<=n;i++){
    73             int m,to;
    74             scanf("%d",&m);
    75             for(int j=0;j<m;j++){
    76                 scanf("%d",&to);
    77                 if(j!=0)    gx.add(i-1,to-1,1);
    78                 else        gx.add(i-1,to-1,0);
    79             }
    80         }
    81         gx.solve(a-1);
    82         int ans=gx.getdist(b-1);
    83         if(ans>1024) ans=-1;
    84         printf("%d
    ",ans);
    85     }
    86     return 0;
    87 }
    View Code

      bell ford ve

     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 Bellman_ford { ///单源最短路o(MV*ME)
    11     typedef int typec;///边权的类型
    12     static const int ME=1000010;///边的个数
    13     static const int MV=1000010;///点的个数
    14     struct E {
    15         int u,v,next;
    16         typec w;
    17     } e[ME];
    18     int n,le,head[MV];
    19     bool used[MV];
    20     typec dist[MV];
    21 public:
    22     void init(int tn) { ///传入点的个数
    23         n=tn;
    24         le=0;
    25         mt(head,-1);
    26     }
    27     void add(int u,int v,typec w) {
    28         e[le].u=u;
    29         e[le].v=v;
    30         e[le].w=w;
    31         e[le].next=head[u];
    32         head[u]=le++;
    33     }
    34     bool solve(int s) {  ///传入起点,下标0开始,为真最短路成功,为假存在负环
    35         for(int i=0; i<n; i++) {
    36             used[i]=true;
    37             dist[i]=inf;
    38         }
    39         used[s]=false;
    40         dist[s]=0;
    41         for(int i=head[s]; ~i; i=e[i].next){
    42             int v=e[i].v;
    43             dist[v]=min(dist[v],e[i].w);
    44         }
    45         for(int i=1; i<n; i++) {
    46             typec sma=inf;
    47             int p;
    48             for(int j=0; j<n; j++) {
    49                 if(used[j]&&sma>dist[j]) {
    50                     p=j;
    51                     sma=dist[j];
    52                 }
    53             }
    54             used[p]=false;
    55             for(int j=head[p]; ~j; j=e[j].next) {
    56                 int v=e[j].v;
    57                 if(!used[v]) continue;
    58                 dist[v]=min(dist[v],e[j].w+dist[e[j].u]);
    59             }
    60         }
    61         bool flag=true;
    62         int j;
    63         for(j=0; flag&&j<=n; j++) {
    64             flag=false;
    65             for(int i=0; i<n; i++) {
    66                 for(int k=head[i]; ~k; k=e[k].next) {
    67                     if(dist[e[k].v]>e[k].w+dist[i]) {
    68                         dist[e[k].v]=e[k].w+dist[i];
    69                         flag=true;
    70                     }
    71                 }
    72             }
    73         }
    74         return j<=n;
    75     }
    76     typec getdist(int id){
    77         return dist[id];
    78     }
    79 }gx;
    80 int main(){
    81     int n,a,b;
    82     while(~scanf("%d%d%d",&n,&a,&b)){
    83         gx.init(n);
    84         for(int i=1;i<=n;i++){
    85             int m,to;
    86             scanf("%d",&m);
    87             for(int j=0;j<m;j++){
    88                 scanf("%d",&to);
    89                 if(j!=0)    gx.add(i-1,to-1,1);
    90                 else        gx.add(i-1,to-1,0);
    91             }
    92         }
    93         gx.solve(a-1);
    94         int ans=gx.getdist(b-1);
    95         if(ans>1024) ans=-1;
    96         printf("%d
    ",ans);
    97     }
    98     return 0;
    99 }
    View Code

     Til the Cows Come Home http://poj.org/problem?id=2387

    dij+priority queue  o (elogv)

     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 Dijkstra { ///单源最短路 o(ME*log(MV))
    11     typedef int typec;///边权的类型
    12     static const int ME=4e3+10;///边的个数
    13     static const int MV=1e3+10;///点的个数
    14     struct Q {
    15         int id;
    16         typec w;
    17         friend bool operator <(const Q &a,const Q &b) {
    18             return a.w>b.w;
    19         }
    20     } now;
    21     priority_queue<Q> q;
    22     struct E {
    23         int v,next;
    24         typec w;
    25     } e[ME];
    26     int n,le,head[MV],u,v,i;
    27     typec dist[MV],w;
    28     bool used[MV];
    29 public:
    30     void init(int tn) {///传入点的个数
    31         n=tn;
    32         le=0;
    33         for(i=0;i<=n;i++) head[i]=-1;
    34     }
    35     void add(int u,int v,typec w) {
    36         e[le].v=v;
    37         e[le].w=w;
    38         e[le].next=head[u];
    39         head[u]=le++;
    40     }
    41     void solve(int s) {///传入起点
    42         for(i=0; i<=n; i++) {
    43             used[i]=true;
    44             dist[i]=inf;
    45         }
    46         dist[s]=0;
    47         now.id=s;
    48         now.w=0;
    49         while(!q.empty()) q.pop();
    50         q.push(now);
    51         while(!q.empty()) {
    52             now=q.top();
    53             q.pop();
    54             u=now.id;
    55             if(used[u]) {
    56                 used[u]=false;
    57                 for(i=head[u]; ~i; i=e[i].next) {
    58                     v=e[i].v;
    59                     w=e[i].w;
    60                     if(used[v]&&dist[v]>w+dist[u]) {
    61                         dist[v]=w+dist[u];
    62                         now.id=v;
    63                         now.w=dist[v];
    64                         q.push(now);
    65                     }
    66                 }
    67             }
    68         }
    69     }
    70     typec getdist(int id) {
    71         return dist[id];
    72     }
    73 } gx;
    74 int main(){
    75     int m,n,u,v,w;
    76     while(~scanf("%d%d",&m,&n)){
    77         gx.init(n);
    78         while(m--){
    79             scanf("%d%d%d",&u,&v,&w);
    80             gx.add(u,v,w);
    81             gx.add(v,u,w);
    82         }
    83         gx.solve(1);
    84         printf("%d
    ",gx.getdist(n));
    85     }
    86     return 0;
    87 }
    View Code

     dij v^2

     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 Dijkstra_Matrix { ///单源最短路 (邻接阵)o(MV^2)
    11     typedef int typec;///边权的类型
    12     static const int MV=1e3+10;///点的个数
    13     int n,pre[MV],i,j,k;
    14     typec mat[MV][MV],dist[MV];
    15     bool vis[MV];
    16 public:
    17     void init(int tn) { ///传入点的个数
    18         n=tn;
    19         for(i=0; i<=n; i++)
    20             for(j=0; j<=n; j++)
    21                 mat[i][j]=i==j?0:inf;
    22     }
    23     void add(int u,int v,typec w) {
    24         mat[u][v]=min(mat[u][v],w);
    25     }
    26     void solve(int s) { ///传入起点
    27         for(i=0; i<=n; i++) {
    28             dist[i]=inf;
    29             vis[i]=false;
    30             pre[i]=-1;
    31         }
    32         for(dist[s]=0,j=0; j<=n; j++) {
    33             for(k=-1,i=0; i<=n; i++) {
    34                 if(!vis[i]&&(k==-1||dist[i]<dist[k])) {
    35                     k=i;
    36                 }
    37             }
    38             for(vis[k]=true,i=0; i<=n; i++) {
    39                 if(!vis[i]&&dist[k]+mat[k][i]<dist[i]) {
    40                     dist[i]=dist[k]+mat[pre[i]=k][i];
    41                 }
    42             }
    43         }
    44     }
    45     typec getdist(int id) {
    46         return dist[id];
    47     }
    48 } gx;
    49 int main(){
    50     int m,n,u,v,w;
    51     while(~scanf("%d%d",&m,&n)){
    52         gx.init(n);
    53         while(m--){
    54             scanf("%d%d%d",&u,&v,&w);
    55             gx.add(u,v,w);
    56             gx.add(v,u,w);
    57         }
    58         gx.solve(1);
    59         printf("%d
    ",gx.getdist(n));
    60     }
    61     return 0;
    62 }
    View Code

     spfa o(2e)

     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 Spfa { ///单源最短路o(2*ME)
    11     typedef int typec;///边权的类型
    12     static const int ME=1000010;///边的个数
    13     static const int MV=1000010;///点的个数
    14     struct E {
    15         int v,next;
    16         typec w;
    17     } e[ME];
    18     int n,le,head[MV],inque[MV];
    19     typec dist[MV];
    20     bool used[MV];
    21     queue<int> q;
    22 public:
    23     void init(int tn) { ///传入点的个数
    24         n=tn;
    25         le=0;
    26         mt(head,-1);
    27     }
    28     void add(int u,int v,typec w) {
    29         e[le].v=v;
    30         e[le].w=w;
    31         e[le].next=head[u];
    32         head[u]=le++;
    33     }
    34     bool solve(int s) { ///传入起点,下标0开始,存在负环返回false
    35         for(int i=0; i<n; i++) {
    36             dist[i]=inf;
    37             used[i]=true;
    38             inque[i]=0;
    39         }
    40         used[s]=false;
    41         dist[s]=0;
    42         inque[s]++;
    43         while(!q.empty()) q.pop();
    44         q.push(s);
    45         while(!q.empty()) {
    46             int u=q.front();
    47             q.pop();
    48             used[u]=true;
    49             for(int i=head[u]; ~i; i=e[i].next) {
    50                 int v=e[i].v;
    51                 if(dist[v]>dist[u]+e[i].w) {
    52                     dist[v]=dist[u]+e[i].w;
    53                     if(used[v]) {
    54                         used[v]=false;
    55                         q.push(v);
    56                         inque[v]++;
    57                         if(inque[v]>n) return false;
    58                     }
    59                 }
    60             }
    61         }
    62         return true;
    63     }
    64     typec getdist(int id) {
    65         return dist[id];
    66     }
    67 } gx;
    68 int main(){
    69     int m,n,u,v,w;
    70     while(~scanf("%d%d",&m,&n)){
    71         gx.init(n);
    72         while(m--){
    73             scanf("%d%d%d",&u,&v,&w);
    74             gx.add(u-1,v-1,w);
    75             gx.add(v-1,u-1,w);
    76         }
    77         gx.solve(0);
    78         printf("%d
    ",gx.getdist(n-1));
    79     }
    80     return 0;
    81 }
    View Code

     bell ford ve

     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 Bellman_ford { ///单源最短路o(MV*ME)
    11     typedef int typec;///边权的类型
    12     static const int ME=1000010;///边的个数
    13     static const int MV=1000010;///点的个数
    14     struct E {
    15         int u,v,next;
    16         typec w;
    17     } e[ME];
    18     int n,le,head[MV];
    19     bool used[MV];
    20     typec dist[MV];
    21 public:
    22     void init(int tn) { ///传入点的个数
    23         n=tn;
    24         le=0;
    25         mt(head,-1);
    26     }
    27     void add(int u,int v,typec w) {
    28         e[le].u=u;
    29         e[le].v=v;
    30         e[le].w=w;
    31         e[le].next=head[u];
    32         head[u]=le++;
    33     }
    34     bool solve(int s) {  ///传入起点,下标0开始,为真最短路成功,为假存在负环
    35         for(int i=0; i<n; i++) {
    36             used[i]=true;
    37             dist[i]=inf;
    38         }
    39         used[s]=false;
    40         dist[s]=0;
    41         for(int i=head[s]; ~i; i=e[i].next){
    42             int v=e[i].v;
    43             dist[v]=min(dist[v],e[i].w);
    44         }
    45         for(int i=1; i<n; i++) {
    46             typec sma=inf;
    47             int p;
    48             for(int j=0; j<n; j++) {
    49                 if(used[j]&&sma>dist[j]) {
    50                     p=j;
    51                     sma=dist[j];
    52                 }
    53             }
    54             used[p]=false;
    55             for(int j=head[p]; ~j; j=e[j].next) {
    56                 int v=e[j].v;
    57                 if(!used[v]) continue;
    58                 dist[v]=min(dist[v],e[j].w+dist[e[j].u]);
    59             }
    60         }
    61         bool flag=true;
    62         int j;
    63         for(j=0; flag&&j<=n; j++) {
    64             flag=false;
    65             for(int i=0; i<n; i++) {
    66                 for(int k=head[i]; ~k; k=e[k].next) {
    67                     if(dist[e[k].v]>e[k].w+dist[i]) {
    68                         dist[e[k].v]=e[k].w+dist[i];
    69                         flag=true;
    70                     }
    71                 }
    72             }
    73         }
    74         return j<=n;
    75     }
    76     typec getdist(int id){
    77         return dist[id];
    78     }
    79 }gx;
    80 int main(){
    81     int m,n,u,v,w;
    82     while(~scanf("%d%d",&m,&n)){
    83         gx.init(n);
    84         while(m--){
    85             scanf("%d%d%d",&u,&v,&w);
    86             gx.add(u-1,v-1,w);
    87             gx.add(v-1,u-1,w);
    88         }
    89         gx.solve(0);
    90         printf("%d
    ",gx.getdist(n-1));
    91     }
    92     return 0;
    93 }
    View Code

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

    dij+priority queue  o (elogv)

      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 Dijkstra { ///单源最短路 o(ME*log(MV))
     13     typedef double typec;///边权的类型
     14     static const int ME=4e5+10;///边的个数
     15     static const int MV=2e3+10;///点的个数
     16     struct Q {
     17         int id;
     18         typec w;
     19         friend bool operator <(const Q &a,const Q &b) {
     20             return a.w>b.w;
     21         }
     22     } now;
     23     priority_queue<Q> q;
     24     struct E {
     25         int v,next;
     26         typec w;
     27     } e[ME];
     28     int n,le,head[MV],u,v,i;
     29     typec dist[MV],w;
     30     bool used[MV];
     31 public:
     32     void init(int tn) {///传入点的个数
     33         n=tn;
     34         le=0;
     35         for(i=0;i<=n;i++) head[i]=-1;
     36     }
     37     void add(int u,int v,typec w) {
     38         e[le].v=v;
     39         e[le].w=w;
     40         e[le].next=head[u];
     41         head[u]=le++;
     42     }
     43     void solve(int s) {///传入起点
     44         for(i=0; i<=n; i++) {
     45             used[i]=true;
     46             dist[i]=inf;
     47         }
     48         dist[s]=0;
     49         now.id=s;
     50         now.w=0;
     51         while(!q.empty()) q.pop();
     52         q.push(now);
     53         while(!q.empty()) {
     54             now=q.top();
     55             q.pop();
     56             u=now.id;
     57             if(used[u]) {
     58                 used[u]=false;
     59                 for(i=head[u]; ~i; i=e[i].next) {
     60                     v=e[i].v;
     61                     w=e[i].w;
     62                     if(used[v]&&dist[v]>w+dist[u]) {
     63                         dist[v]=w+dist[u];
     64                         now.id=v;
     65                         now.w=dist[v];
     66                         q.push(now);
     67                     }
     68                 }
     69             }
     70         }
     71     }
     72     typec getdist(int id) {
     73         return dist[id];
     74     }
     75 } gx;
     76 struct point{
     77     double x,y;
     78 }p[M];
     79 double a[M][M];
     80 int main() {
     81     int i,j,c,flag=0;
     82     scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
     83     int n=2;
     84     while(~scanf("%lf%lf",&p[n].x,&p[n].y)) {
     85         if(p[n].x==-1&&p[n].y==-1) {
     86             flag=0;
     87             continue;
     88         }
     89         if(flag) {
     90             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;
     91             a[n-1][n]=a[n][n-1];
     92         }
     93         n++;
     94         flag=1;
     95     }
     96     for(i=0; i<n; i++) {
     97         for(j=0; j<n; j++) {
     98             if(i!=j&&a[i][j]==0.0) {
     99                 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;
    100             }
    101         }
    102     }
    103     gx.init(n);
    104     for(i=0;i<n;i++){
    105         for(j=0;j<n;j++){
    106             gx.add(i,j,a[i][j]);
    107         }
    108     }
    109     gx.solve(0);
    110     printf("%0.0f
    ",60.0*gx.getdist(1));
    111     return 0;
    112 }
    View Code

     dij v^2

     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 Dijkstra_Matrix { ///单源最短路 (邻接阵)o(MV^2)
    13     typedef double typec;///边权的类型
    14     static const int MV=2e2+10;///点的个数
    15     int n,pre[MV],i,j,k;
    16     typec mat[MV][MV],dist[MV];
    17     bool vis[MV];
    18 public:
    19     void init(int tn) { ///传入点的个数
    20         n=tn;
    21         for(i=0; i<=n; i++)
    22             for(j=0; j<=n; j++)
    23                 mat[i][j]=i==j?0:inf;
    24     }
    25     void add(int u,int v,typec w) {
    26         mat[u][v]=min(mat[u][v],w);
    27     }
    28     void solve(int s) { ///传入起点
    29         for(i=0; i<=n; i++) {
    30             dist[i]=inf;
    31             vis[i]=false;
    32             pre[i]=-1;
    33         }
    34         for(dist[s]=0,j=0; j<=n; j++) {
    35             for(k=-1,i=0; i<=n; i++) {
    36                 if(!vis[i]&&(k==-1||dist[i]<dist[k])) {
    37                     k=i;
    38                 }
    39             }
    40             for(vis[k]=true,i=0; i<=n; i++) {
    41                 if(!vis[i]&&dist[k]+mat[k][i]<dist[i]) {
    42                     dist[i]=dist[k]+mat[pre[i]=k][i];
    43                 }
    44             }
    45         }
    46     }
    47     typec getdist(int id) {
    48         return dist[id];
    49     }
    50 } gx;
    51 struct point{
    52     double x,y;
    53 }p[M];
    54 double a[M][M];
    55 int main() {
    56     int i,j,c,flag=0;
    57     scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
    58     int n=2;
    59     while(~scanf("%lf%lf",&p[n].x,&p[n].y)) {
    60         if(p[n].x==-1&&p[n].y==-1) {
    61             flag=0;
    62             continue;
    63         }
    64         if(flag) {
    65             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;
    66             a[n-1][n]=a[n][n-1];
    67         }
    68         n++;
    69         flag=1;
    70     }
    71     for(i=0; i<n; i++) {
    72         for(j=0; j<n; j++) {
    73             if(i!=j&&a[i][j]==0.0) {
    74                 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;
    75             }
    76         }
    77     }
    78     gx.init(n);
    79     for(i=0;i<n;i++){
    80         for(j=0;j<n;j++){
    81             gx.add(i,j,a[i][j]);
    82         }
    83     }
    84     gx.solve(0);
    85     printf("%0.0f
    ",60.0*gx.getdist(1));
    86     return 0;
    87 }
    View Code

     spfa(2e)

      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 Spfa { ///单源最短路o(2*ME)
     13     typedef double typec;///边权的类型
     14     static const int ME=M*M;///边的个数
     15     static const int MV=M;///点的个数
     16     struct E {
     17         int v,next;
     18         typec w;
     19     } e[ME];
     20     int n,le,head[MV],inque[MV];
     21     typec dist[MV];
     22     bool used[MV];
     23     queue<int> q;
     24 public:
     25     void init(int tn) { ///传入点的个数
     26         n=tn;
     27         le=0;
     28         mt(head,-1);
     29     }
     30     void add(int u,int v,typec w) {
     31         e[le].v=v;
     32         e[le].w=w;
     33         e[le].next=head[u];
     34         head[u]=le++;
     35     }
     36     bool solve(int s) { ///传入起点,下标0开始,存在负环返回false
     37         for(int i=0; i<n; i++) {
     38             dist[i]=inf;
     39             used[i]=true;
     40             inque[i]=0;
     41         }
     42         used[s]=false;
     43         dist[s]=0;
     44         inque[s]++;
     45         while(!q.empty()) q.pop();
     46         q.push(s);
     47         while(!q.empty()) {
     48             int u=q.front();
     49             q.pop();
     50             used[u]=true;
     51             for(int i=head[u]; ~i; i=e[i].next) {
     52                 int v=e[i].v;
     53                 if(dist[v]>dist[u]+e[i].w) {
     54                     dist[v]=dist[u]+e[i].w;
     55                     if(used[v]) {
     56                         used[v]=false;
     57                         q.push(v);
     58                         inque[v]++;
     59                         if(inque[v]>n) return false;
     60                     }
     61                 }
     62             }
     63         }
     64         return true;
     65     }
     66     typec getdist(int id) {
     67         return dist[id];
     68     }
     69 } gx;
     70 struct point{
     71     double x,y;
     72 }p[M];
     73 double a[M][M];
     74 int main() {
     75     int i,j,c,flag=0;
     76     scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
     77     int n=2;
     78     while(~scanf("%lf%lf",&p[n].x,&p[n].y)) {
     79         if(p[n].x==-1&&p[n].y==-1) {
     80             flag=0;
     81             continue;
     82         }
     83         if(flag) {
     84             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;
     85             a[n-1][n]=a[n][n-1];
     86         }
     87         n++;
     88         flag=1;
     89     }
     90     for(i=0; i<n; i++) {
     91         for(j=0; j<n; j++) {
     92             if(i!=j&&a[i][j]==0.0) {
     93                 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;
     94             }
     95         }
     96     }
     97     gx.init(n);
     98     for(i=0;i<n;i++){
     99         for(j=0;j<n;j++){
    100             gx.add(i,j,a[i][j]);
    101         }
    102     }
    103     gx.solve(0);
    104     printf("%0.0f
    ",60.0*gx.getdist(1));
    105     return 0;
    106 }
    View Code

     bell ford ve

      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 Bellman_ford { ///单源最短路o(MV*ME)
     13     typedef double typec;///边权的类型
     14     static const int ME=M*M;///边的个数
     15     static const int MV=M;///点的个数
     16     struct E {
     17         int u,v,next;
     18         typec w;
     19     } e[ME];
     20     int n,le,head[MV];
     21     bool used[MV];
     22     typec dist[MV];
     23 public:
     24     void init(int tn) { ///传入点的个数
     25         n=tn;
     26         le=0;
     27         mt(head,-1);
     28     }
     29     void add(int u,int v,typec w) {
     30         e[le].u=u;
     31         e[le].v=v;
     32         e[le].w=w;
     33         e[le].next=head[u];
     34         head[u]=le++;
     35     }
     36     bool solve(int s) {  ///传入起点,下标0开始,为真最短路成功,为假存在负环
     37         for(int i=0; i<n; i++) {
     38             used[i]=true;
     39             dist[i]=inf;
     40         }
     41         used[s]=false;
     42         dist[s]=0;
     43         for(int i=head[s]; ~i; i=e[i].next){
     44             int v=e[i].v;
     45             dist[v]=min(dist[v],e[i].w);
     46         }
     47         for(int i=1; i<n; i++) {
     48             typec sma=inf;
     49             int p;
     50             for(int j=0; j<n; j++) {
     51                 if(used[j]&&sma>dist[j]) {
     52                     p=j;
     53                     sma=dist[j];
     54                 }
     55             }
     56             used[p]=false;
     57             for(int j=head[p]; ~j; j=e[j].next) {
     58                 int v=e[j].v;
     59                 if(!used[v]) continue;
     60                 dist[v]=min(dist[v],e[j].w+dist[e[j].u]);
     61             }
     62         }
     63         bool flag=true;
     64         int j;
     65         for(j=0; flag&&j<=n; j++) {
     66             flag=false;
     67             for(int i=0; i<n; i++) {
     68                 for(int k=head[i]; ~k; k=e[k].next) {
     69                     if(dist[e[k].v]>e[k].w+dist[i]) {
     70                         dist[e[k].v]=e[k].w+dist[i];
     71                         flag=true;
     72                     }
     73                 }
     74             }
     75         }
     76         return j<=n;
     77     }
     78     typec getdist(int id){
     79         return dist[id];
     80     }
     81 }gx;
     82 struct point{
     83     double x,y;
     84 }p[M];
     85 double a[M][M];
     86 int main() {
     87     int i,j,c,flag=0;
     88     scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
     89     int n=2;
     90     while(~scanf("%lf%lf",&p[n].x,&p[n].y)) {
     91         if(p[n].x==-1&&p[n].y==-1) {
     92             flag=0;
     93             continue;
     94         }
     95         if(flag) {
     96             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;
     97             a[n-1][n]=a[n][n-1];
     98         }
     99         n++;
    100         flag=1;
    101     }
    102     for(i=0; i<n; i++) {
    103         for(j=0; j<n; j++) {
    104             if(i!=j&&a[i][j]==0.0) {
    105                 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;
    106             }
    107         }
    108     }
    109     gx.init(n);
    110     for(i=0;i<n;i++){
    111         for(j=0;j<n;j++){
    112             gx.add(i,j,a[i][j]);
    113         }
    114     }
    115     gx.solve(0);
    116     printf("%0.0f
    ",60.0*gx.getdist(1));
    117     return 0;
    118 }
    View Code

    end

  • 相关阅读:
    Java面试知识点总结
    Log4j常用配置及使用
    Eclipse+tomcat+axis2进行web service部署
    iframe内点击a标签禁止滚动到顶部
    VScode首选项
    Bookmarks
    VScode常用插件
    slideout
    bs-loading
    iPhone X 上删除白条
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/3951334.html
Copyright © 2020-2023  润新知