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


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

    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 }

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

  • 相关阅读:
    “猫癣”集团借IE7新漏洞再掀风浪 狼人:
    研究人员在黑帽安全大会演示SSL攻击 狼人:
    猫癣病毒“躲猫猫” 移师广东东莞月入百万 狼人:
    Adobe两款软件存在缺陷 黑客可控制用户PC 狼人:
    安全观点:遭遇数据泄露破坏 损失的不只是金钱 狼人:
    McAfee报告称七成手机制造商认为手机安全至关重要 狼人:
    微软表示本月将发布五个Windows 7更新 狼人:
    Gmail电子邮件曝全球性故障 谷歌向用户道歉 狼人:
    Google Talk被黑客利用 发动钓鱼攻击 狼人:
    谷歌GMail邮件服务出现故障 部分服务已恢复 狼人:
  • 原文地址:https://www.cnblogs.com/xiaolitongxueyaoshangjin/p/12526738.html
Copyright © 2020-2023  润新知