站外题求助
  • 板块学术版
  • 楼主AutumnQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/27 22:59
  • 上次更新2024/6/28 12:13:26
查看原帖
站外题求助
1038710
AutumnQ楼主2024/6/27 22:59

POJ3114

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <complex>
#include <csignal>
#include <csetjmp>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
using namespace std;
bool ins[550],vis[550],vis1[550];
int dfn[550],low[550],bel[550],dis[550];
int t,bcnt,top,n,m;
int s[550];
struct node{
	int v,w;
};
vector<node> g[550],G[550];
inline void print(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x<10){
		putchar(x^48);
		return;
	}
	print(x/10);
	putchar(x%10^48);
}
void dij(int x,int y){
	memset(dis,0x3f,sizeof(dis));
	dis[x]=0;
	priority_queue < pair<int,int> > q;
	q.push(make_pair(0,x));
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(vis1[u])continue;
		vis1[u]=true;
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i].v;
			int w=G[u][i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push(make_pair(-dis[v],v));
			}
		}
	} 
	if(dis[y]!=0x3f3f3f3f)print(dis[y]),putchar('\n');
	else puts("Nao e possivel entregar a carta");
}
void tarjan(int u){
	int v;
	low[u]=dfn[u]=++t;
	s[top++]=u;
	ins[u]=true;
	for(int i=0;i<g[u].size();i++){
		v=g[u][i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(ins[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		bcnt++;
		do{
			v=s[--top];
			ins[v]=false;
			bel[v]=bcnt;
		}while(v!=u);
	}
}

inline int read(){
	int x=0,k=1;
	char ch=getchar();
	while(!isdigit(ch) && ch!='-')ch=getchar();
	if(ch=='-'){
		k=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*k;
}

int main(){
	int u,v,a,b,w;
	while(cin>>n>>m && (n || m)){
		t=bcnt=top=0;
		for(int i=1;i<=n;i++)G[i].clear(),g[i].clear();
		memset(ins,false,sizeof(ins));
		memset(dfn,0,sizeof(dfn));
		memset(dis,0x3f,sizeof(dis));
		while(m--){
			a=read();
			b=read();
			w=read();
			g[a].push_back({b,w});
		}
		for(u=1;u<=n;u++){
			if(!dfn[u])tarjan(u);
		}
		for(int i=1;i<=n;i++){
			for(int j=0;j<g[i].size();j++){
				int v=g[i][j].v,w=g[i][j].w;
				if(bel[i]!=bel[v])G[bel[i]].push_back({bel[v],w});
			}
		}
		int q;
		cin>>q;
		while(q--){
			int a,b;
			a=read(),b=read();
			dij(bel[a],bel[b]);
		}
		putchar('\n');	
	}
}
2024/6/27 22:59
加载中...