zoukankan      html  css  js  c++  java
  • 2019ACM-ICPC南京网络赛Holy Grail (SPFA / Floyd 模板题)

    Holy Grail
     
    限制
    1000 ms
    256 MB
     
    As the current heir of a wizarding family with a long history,unfortunately, you fifind yourself
    forced to participate in the cruel Holy Grail War which has a reincarnation of sixty
    years.However,fortunately,you summoned a Caster Servant with a powerful Noble
    Phantasm.When your servant launch her Noble Phantasm,it will construct a magic
    fifield,which is actually a directed graph consisting of n vertices and m edges.More
    specififically,the graph satisfifies the following restrictions :
    Does not have multiple edges(for each pair of vertices x and y, there is at most one
    edge between this pair of vertices in the graph) and does not have self-loops(edges
    connecting the vertex with itself).
    May have negative-weighted edges.
    Does not have a negative-weighted loop.
    n<=300 , m<=500.
    Currently,as your servant's Master,as long as you add extra 6 edges to the graph,you will
    beat the other 6 masters to win the Holy Grail.
    However,you are subject to the following restrictions when you add the edges to the
    graph:
    Each time you add an edge whose cost is c,it will cost you c units of Magic
    Value.Therefore,you need to add an edge which has the lowest weight(it's probably
    that you need to add an edge which has a negative weight).
    Each time you add an edge to the graph,the graph must not have negative
    loops,otherwise you will be engulfed by the Holy Grail you summon.
     
    Input
     
    Input data contains multiple test cases. The fifirst line of input contains integer t — the
    number of test
    cases (1 ≤ t ≤ 5).
    For each test case,the fifirst line contains two integers n,m,the number of vertices in the
    graph, the initial number of edges in the graph.
    Then m lines follow, each line contains three integers x, y and w (0 ≤ x, y < n,−109≤w≤
    109, x = y) denoting an edge from vertices x to y (0-indexed) of weight w.Then 6 lines follow, each line contains two integers s,t denoting the starting vertex and
    the ending vertex of the edge you need to add to the graph.
    It is guaranteed that there is not an edge starting from s to t before you add any edges and
    there must exists such an edge which has the lowest weight and satisfifies the above
    restrictions, meaning the solution absolutely exists for each query.
     
    Output
     
    For each test case,output 6 lines.
    Each line contains the weight of the edge you add to the graph.
     
    Sample Input
     
    1
    10 15
    4 7 10
    7 6 3
    5 3 3
    1 4 11
    0 6 20
    9 8 25
    3 0 9
    1 2 15
    9 0 27
    5 2 0
    7 3 -5
    1 7 21
    5 0 1
    9 3 16
    1 8 4
    4 1
    0 3
    6 9
    2 1
    8 7
    0 4
     
    Sample Output-11
     
    -9
    -45
    -15
    17
    7
     
    比赛时用的SPFA,其实用Floyd也可以做,泪奔,awsl。。。。。。。。。。。。。。。。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn=3e2+7,maxm=5e2+5;
     5 const ll inf=1e16;
     6 int head[maxm],vis[maxn],cnt=0;
     7 ll dist[maxn];
     8 struct node
     9 {
    10     int to,next;
    11     ll w;
    12 } edge[maxm];
    13 void add(int a,int b,ll w)
    14 {
    15     edge[++cnt].to=b,edge[cnt].next=head[a];
    16     edge[cnt].w=w,head[a]=cnt;
    17 }
    18 queue<int>que;
    19 void spfa(int t)
    20 {
    21     dist[t]=0,vis[t]=1;
    22     que.push(t);
    23     while(que.size())
    24     {
    25         int now=que.front();
    26         que.pop();
    27         vis[now]=0;
    28         for(int i=head[now]; i; i=edge[i].next)
    29         {
    30             int to=edge[i].to,w=edge[i].w;
    31             if(dist[to]>dist[now]+w)
    32             {
    33                 dist[to]=dist[now]+w;
    34                 if(!vis[to])
    35                 {
    36                     que.push(to);
    37                     vis[to]=1;
    38                 }
    39             }
    40         }
    41     }
    42 }
    43 int main()
    44 {
    45     int t;
    46     scanf("%d",&t);
    47     while(t--)
    48     {
    49         cnt=0;
    50         memset(vis,0,sizeof(vis));
    51         memset(head,0,sizeof(head));
    52         for(int i=0; i<=maxn-2; ++i)
    53             dist[i]=inf;
    54         int n,m,a,b,s,t;
    55         ll w;
    56         scanf("%d%d",&n,&m);
    57         for(int i=1; i<=m; ++i)
    58         {
    59             scanf("%d %d %lld",&a,&b,&w);
    60             add(a,b,w);
    61         }
    62         for(int i=1; i<=6; ++i)
    63         {
    64             scanf("%d %d",&s,&t);
    65             spfa(t);
    66             printf("%lld
    ",-dist[s]);
    67             add(s,t,-dist[s]);
    68             memset(vis,0,sizeof(vis));
    69             for(int i=0; i<=maxn-2; ++i)
    70                 dist[i]=inf;
    71         }
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    45个非常有用的Oracle查询语句(转自开源中国社区)
    Oracle创建表空间及用户
    table里面,怎么根据checkbox选择的一行中的某个单元格的值是否为空,来判断是否该选中
    点击上传按钮,文件自动上传
    如何给frame标签的src属性以及a标签的href属性自动设值
    Tomcat内存溢出的三种情况及解决办法分析
    Java中判断字符串是否为数字的五种方法
    SSH项目里面 忘记密码的邮件发送功能
    form表单提交时,action怎么带参数
    因为多余jar包,所报的错
  • 原文地址:https://www.cnblogs.com/CharlieWade/p/11443389.html
Copyright © 2011-2022 走看看