比赛 防止颓废的小练习v0.3 评测结果 AAAAAAAAA
题目名称 道路重建 最终得分 100
用户昵称 农场主 运行时间 0.028 s
代码语言 C++ 内存使用 1.00 MiB
提交时间 2016-10-19 17:17:25
显示代码纯文本
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
#define maxn 1000 
#define INF 1<<29
using namespace std;
class edge{
public:
	int from,to,dis,w;
};
vector<edge> G[maxn];
bool des[maxn][maxn]={0};
int d[maxn]={0},inq[maxn]={0};
int n,m,k,s,t;
void spfa(int s,int t){
	for (int i=1;i<=n;i++){
		d[i]=INF;
	}
	d[s]=0; inq[s]=1;
	queue<int> q;
	q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop(); inq[x]=0;
		for (int i=0;i<G[x].size();i++){
			edge& e=G[x][i];
			if (d[e.to]>d[e.from]+e.w){
				d[e.to]=d[e.from]+e.w;
				if (!inq[e.to]){
					inq[e.to]=1;
					q.push(e.to);
				}
			}
		}
	}
	printf("%d",d[t]);
}
void read(){
	scanf("%d%d",&n,&m);
	int u,v,w;
	for (int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		G[u].push_back((edge){u,v,w,0});
		G[v].push_back((edge){v,u,w,0});
	}
	scanf("%d",&k);
	for (int i=1;i<=k;i++){
		scanf("%d%d",&u,&v);
		des[u][v]=1;
		des[v][u]=1;
	}
	scanf("%d%d",&s,&t);
	for (int i=1;i<=n;i++){
		for (int j=0;j<G[i].size();j++){
			edge& e=G[i][j];
			if (des[e.from][e.to]==1){
				e.w=e.dis;
			}
		}
	}
}
int main(){
	freopen("rebuild.in","r",stdin);
	freopen("rebuild.out","w",stdout);
	read();
	spfa(s,t);
}