zoukankan      html  css  js  c++  java
  • zzuli 2179 最短路

    2179: 紧急营救

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 89  Solved: 9

    SubmitStatusWeb Board

    Description

    冷锋在非洲完成任务后回到了狼牙特种作战部队。我们知道在战狼二结尾,冷锋正在北极执行任务,而部队发现了龙小云在c国的消息,让冷锋尽快赶往c国。我们知道现在地球上共有n个国家和地区,编号分别为1,2,3...n。国家与国家之间的可能通航班(可能不止一次),也可能没有通航班。共有m次航班,冷锋已经知道了这m次航班的信息(起点 终点,时间)北极的编号是1,c国的编号是n。
    而冷峰身为超级英雄一样的的存在,他有一次将航班的时间降为零的能力。

    Input

    样例数t(t<=10),接下来又t组样例。 每组样例先输入n , m(n<=1000 , m<=n*(n-1)/2)。

    下面m行航班的信息,分别为start , end , time(time <= 100000).

    Output

    对每组样例,输出冷锋到达c国的最短时间,若不能到达输出 "Impossible"。

    Sample Input

    3 3 1 1 2 1 4 3 1 2 4 2 3 1 2 4 4 3 3 1 2 100000 2 3 1 1 3 2

    Sample Output

    Impossible 4 0
    不知道是我语文没学好还是怎么着,题目描述的显然是有向图竟然改成无向图才能A,真是醉了= =
    如果是无向图需要反向建边,不过无向得话就不必要了,跑两次最短路,分别以1和N为起点,然后枚举每一条边为零,看看是否能更新这条1-N的最短路。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 #define inf 0x3f3f3f3f
     5 const int maxn=1005;
     6 struct Edge{int u,v,w;};
     7 vector<Edge>G[maxn];
     8 int d1[1005],d2[1005];
     9 void spfa(int s,int *d)
    10 {
    11     bool vis[1005];
    12     memset(vis,0,sizeof(vis));
    13     memset(d,inf,sizeof(int)*1001);
    14     queue<int>Q;
    15     Q.push(s);
    16     vis[s]=1;
    17     d[s]=0;
    18     while(!Q.empty()){
    19         int u=Q.front(); Q.pop();
    20         vis[u]=0;
    21         for(int i=0;i<G[u].size();++i){
    22             Edge x=G[u][i];
    23             if(d[x.v]>d[u]+x.w){
    24                 d[x.v]=d[u]+x.w;
    25                 if(!vis[x.v]){
    26                     vis[x.v]=1;
    27                     Q.push(x.v);
    28                 }
    29             }
    30         }
    31     }
    32 }
    33 int main()
    34 {
    35     //freopen("in.txt","r",stdin);
    36     int T,N,M,i,j,k;
    37     int u,v,w;
    38     cin>>T;
    39     while(T--){
    40         scanf("%d%d",&N,&M);
    41         for(i=0;i<M;++i){
    42             scanf("%d%d%d",&u,&v,&w);
    43             G[u].push_back(Edge{u,v,w});
    44             G[v].push_back(Edge{v,u,w});
    45         }
    46         spfa(1,d1);
    47         spfa(N,d2);
    48         int ans=inf;
    49         for(i=1;i<=N;++i)
    50         {
    51             for(j=0;j<G[i].size();++j)
    52             {
    53                 ans=min(ans,d1[i]+d2[G[i][j].v]);
    54             }
    55         }
    56         for(i=0;i<=N;++i) G[i].clear();
    57         if(ans==inf) puts("Impossible");
    58         else cout<<ans<<endl;
    59     }
    60     return 0;
    61 }
    62 //注释freopen语句!!!
  • 相关阅读:
    笨方法学python(本文为阅读时从此书摘录的笔记) 第一天
    关于C++中的虚拟继承的一些总结
    用提高效率的暴力法求3000以内的素数
    DAY 155 python中parse模块
    DAY 154 python自带的hmac模块
    DAY 153 Python中使用pymongo操作mongodb
    DAY 152 hmac模块
    DAY 151 parse模块
    DAY 150 setter&getter&@property
    DAY 149 property和setter装饰器
  • 原文地址:https://www.cnblogs.com/zzqc/p/7394064.html
Copyright © 2011-2022 走看看