zzuli 2179 最短路
2179: 紧急营救
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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语句!!!