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 }
  • 相关阅读:
    常用MySQL函数连接
    spring boot和mybatis的多源配置亲测可用非常简单哦铁闸门
    RestTemplate请求发送post请求携带数组参数(亲测有效)
    idea配置tomcat
    前后端分离生成手机验证码
    前后端分离的图片验证保存及发送方式
    Java—大文件分片上传
    SpringAOP实战
    Spring Boot AOP的使用
    iOS开发日常记录
  • 原文地址:https://www.cnblogs.com/CharlieWade/p/11443389.html
Copyright © 2011-2022 走看看