河南省多校连萌(四)

点击打开链接



Problem B: 紧急营救

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 100   Solved: 15

Submit Web 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 12 4 4
3 3
1 2 1 00000
2 3 1
1 3 2

Sample Output

Impossible
40

HINT



C/C++ (clang++ 3.3)
1
#include
2
using namespace std;
3
const int inf=0x3f3f3f3f;
4
int a[1100][1100];
5
int d1[1100],d2[1100],vis[1100];
6
int n;
7
void dijstra(int d[],int s)
8
{
9
    memset(vis,0,sizeof vis);
10
    vis[s]=1;
11
    for(int i=1; i<=n; i++)
12
        d[i]=a[s][i];
13
    for(int i=0; i<n; i++)
14
    {
15
        int mix=inf,t;
16
        for(int j=0; j<=n; j++)
17
        {
18
            if(!vis[j]&&mix>d[j])
19
            {
20
                mix=d[j];
21
                t=j;
22
            }
23
        }
24
        if(mix==inf)break;
25
        vis[t]=1;
26
        for(int j=1; j<=n; j++)
27
        {
28
            if(!vis[j]&&d[j]>d[t]+a[t][j])
29
                d[j]=d[t]+a[t][j];
30
        }
31
    }
32
}
33
int main()
34
{
35
    int t;
36
    scanf("%d",&t);
37
    while(t--)
38
    {
39
        int m;
40
        memset(a,0x3f,sizeof a);
41
        scanf("%d%d",&n,&m);
42
        for(int i=1; i<=n; i++)a[i][i]=0;
43
        for(int i=0; i<m; i++)
44
        {
45
            int u,v,w;
46
            scanf("%d %d %d",&u,&v,&w);
47
            if(a[u][v]>w)a[u][v]=a[v][u]=w;
48
        }
49
        int mix=inf;
50
        dijstra(d1,1),dijstra(d2,n);
51
        for(int i=1; i<=n; i++)
52
        {
53
            for(int j=1; j<=n; j++)
54
                if(a[i][j]!=inf&&i!=j)
55
                {
56
                    mix=min(d1[i]+d2[j],mix);
57
                    mix=min(d1[j]+d2[i],mix);
58
                }
59
        }
60
        if(mix==inf)puts("Impossible");
61
        else
62
        printf("%d\n",mix);
63
    }
64
    return 0;
65
}
66


  可以求出起点到所有点的最短路和终点到所有点的最短路,用dis1[maxn],dis2[maxn]表示,现在
考虑枚举每一条边。对于边(u , v),如果两点有值的话我们就可以尝试将它的时间降为0,那么
ans = min(ans , min(dis1[u]+dis2[v] , dis1[v]+dis2[u]))。枚举每一条边,取最小就好了。









你可能感兴趣的:(河南省多校连萌(四))