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语句!!!
原文地址:https://www.cnblogs.com/zzqc/p/7394064.html