题目描述
有n(n<=50)个城市,保证每个城市与其他城市之间必然有连接,但是两个城市之间会存在多条道路,输入道路连接的两个城市号及道路长度。同时在夜晚,某些道路会封路。请输出在白天和夜晚从城市1到城市n之间的最短路径
输入描述:
先输入T,表示有T组数据
再输入n,m,k,n表示有n个城市,表示总共有m条边,k表示在夜晚有k条路封路
接下来m行,每行输入三个数x,y,z,代表城市x和城市y之间的路径距离
最后一行k个数,代表晚上关闭的线路序号(线路序号指的是1~m)
输出描述:
每组数据输出两行,分别代表白天和黑夜,城市1到n的最短路径
输入样例
1
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4
输出样例
1
3
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 51;
const int INF = INT_MAX;
struct Edge{
int to;
int len;
int sequence;
Edge(int t,int l,int se):to(t),len(l),sequence(se){}
};
struct Point{
int num;
int dis;
Point(int n,int d):num(n),dis(d){}
bool operator< (const Point &p) const{
return dis>p.dis;
}
};
vector<Edge> graph[MAXN];
int dis[MAXN];
void Dijkstra(int s){
priority_queue <Point> pq;
dis[s]=0;
pq.push(Point(s,dis[s]));
while(!pq.empty()){
int u=pq.top().num;
pq.pop();
for(int i=0;i<graph[u].size();i++){
int v = graph[u][i].to;
int d = graph[u][i].len;
if(dis[v]>dis[u]+d){
dis[v]=dis[u]+d;
pq.push(Point(v,dis[v]));
}
}
}
}
int main(){
int t,n,m,k,night;
int answer1,answer2;
cin>>t;
while(t--){
cin>>n>>m>>k;
memset(graph,0,sizeof(graph));
fill(dis,dis+n+1,INF);
int from,to,len;
for(int i=0;i<m;i++){
cin>>from>>to>>len;
graph[from].push_back(Edge(to,len,i+1));
graph[to].push_back(Edge(from,len,i+1));
}
Dijkstra(1);
answer1 = dis[n];
for(int j=0;j<k;j++){
cin>>night;
for(int i=1;i<=n;i++){
for(int l=0;l<graph[i].size();l++){
if(graph[i][l].sequence==night){
graph[i][l].len=100;//这儿不知道为什么写无穷没反应,回头再补,电脑没电了
}
}
}
}
fill(dis,dis+n+1,INF);
Dijkstra(1);
answer2 = dis[n];
cout<<answer1<<endl;
cout<<answer2<<endl;
}
return 0;
}