zoukankan      html  css  js  c++  java
  • 图的基本存储的基本方式三

    图的基本存储的基本方式三

    Description

    解决图论问题,首先就要思考用什么样的方式存储图。但是小鑫却怎么也弄不明白如何存图才能有利于解决问题。你能帮他解决这个问题么?

    Input

     多组输入,到文件结尾。

    每一组第一行有两个数nm表示n个点,m条有向边。接下来有m行,每行两个数uvw代表uv有一条有向边权值为w。第m+2行有一个数q代表询问次数,接下来q行每行有一个询问,输入一个数为a

    注意:点的编号为0~n-12<=n<=500000 0<=m<=5000000<=q<=500000,u!=vwint型数据。输入保证没有自环和重边

    Output

     对于每一条询问,输出一行两个数xy。表示排序后第a条边是由xy的。对于每条边来说排序规则如下:
    1. 权值小的在前。

    2. 权值相等的边出发点编号小的在前

    3. 权值和出发点相等的到达点编号小的在前

    注:边的编号自0开始

    Sample

    Input 

    4 3
    0 1 1
    1 2 2
    1 3 0
    3
    0
    1
    2

    Output 

    1 3
    0 1
    1 2

    Hint

     
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 struct node
     5 {
     6     int u, v, w;
     7 } p[500010];
     8 void kuaipai(struct node p[], int l, int r)
     9 {
    10     int i, j, x, y, z;
    11     if(l < r)
    12     {
    13         i = l;
    14         j = r;
    15         x = p[i].w;
    16         y = p[i].u;
    17         z = p[i].v;
    18         while(i < j)//控制循环跳出
    19         {
    20             while((i < j && p[j].w > x) || (i < j && p[j].w == x && p[j].u > y) || (i < j && p[j].w == x && p[j].u == y && p[j].v > z))//控制排序条件
    21                 j--;
    22             if(i < j)
    23             {
    24                 p[i] = p[j];
    25                 i++;
    26             }
    27             while((i < j && p[i].w < x) || (i < j && p[i].w == x && p[i].u < y) || (i < j && p[i].w == x && p[i].u == y && p[i].v < z))
    28                 i++;
    29             if(i < j)
    30             {
    31                 p[j] = p[i];
    32                 j--;
    33             }
    34         }
    35         p[i].w = x;
    36         p[i].u = y;
    37         p[i].v = z;
    38         kuaipai(p, l, i-1);//递归调用
    39         kuaipai(p, i+1, r);
    40     }
    41     else return;
    42 }
    43 int main()
    44 {
    45     int n, m, i, q;
    46     while(scanf("%d%d", &n, &m) != EOF)
    47     {
    48         memset(p, 0, sizeof(p));
    49         for(i = 0; i < m; i++)
    50         {
    51             scanf("%d%d%d", &p[i].u, &p[i].v, &p[i].w);
    52         }
    53         kuaipai(p, 0, m - 1);
    54         scanf("%d", &q);
    55         int a;
    56         while(q--)
    57         {
    58             scanf("%d", &a);
    59             printf("%d %d
    ", p[a].u, p[a].v);
    60         }
    61     }
    62     return 0;
    63 }

    本题要用快速排序 图只是一个抽象的概念,其实并不一定要用邻接表和邻接矩阵,怎么方便怎么使用就可以

  • 相关阅读:
    3、linux网络编程--网络字节序
    1、linux网络编程--网络协议
    第四篇:进程
    第五篇:进程通信
    第六篇:线程原理
    操作系统基本概念
    第一篇:基础原理篇
    第二篇:操作系统历史
    (2)linux下的简单的socket通信实例
    (3)基于linux的socket编程TCP半双工client-server聊天程序
  • 原文地址:https://www.cnblogs.com/xiaolitongxueyaoshangjin/p/12526738.html
Copyright © 2011-2022 走看看