洛谷 P2149 [SDOI2009]Elaxia的路线

版权声明:欢迎转载欢迎评论! https://blog.csdn.net/rabbit_ZAR/article/details/85250901

并不会写先存个档

#include<bits/stdc++.h>
using namespace std;

#define maxn 1500
#define read(x) scanf("%d",&x)
#define inf ((int)(1e9))

struct Edge{
	int x,y,z;
	Edge(){}
	Edge(int xx,int yy,int zz) {x=xx,y=yy,z=zz;}
};

struct Pair{
	int x,z;
	Pair(){}
	Pair(int xx,int zz) {x=xx,z=zz;}
	bool operator < (const Pair& oth) const {
		return z>oth.z;
	}
};

int n,m;
int s1,t1,s2,t2;

vector<Edge> g[maxn+5];
int dist1[maxn+5],dist2[maxn+5],dist3[maxn+5],dist4[maxn+5];
priority_queue<Pair> que,emp;
int vis[maxn+5];

vector<int> fr1[maxn+5],fr2[maxn+5],fr3[maxn+5],fr4[maxn+5];
vector<int> fr[maxn+5];

int a[maxn+5][maxn+5],b[maxn+5][maxn+5];

void dijkstra (int x,int* dist) {
	for(int i=1;i<=n;i++) if(i!=x) dist[i]=1e9;
	memset(vis,0,sizeof(vis));
	que=emp;
	que.push(Pair(x,0));
	
	while(!que.empty()) {
		int h=que.top().x;que.pop();
		if(vis[h]) continue;
		vis[h]=true;
		
		for(int i=0;i<g[h].size();i++) {
			int x=g[h][i].y;
			if(dist[x]>dist[h]+g[h][i].z) {
				dist[x]=dist[h]+g[h][i].z;
				fr[x].clear();
				fr[x].push_back(h);
				que.push(Pair(x,dist[x]));
			} else if(dist[x]==dist[h]+g[h][i].z) fr[x].push_back(h);
		}
	}
}

int main() {
	read(n),read(m);
	read(s1),read(t1),read(s2),read(t2);
	
	for(int i=1;i<=m;i++) {
		int x,y,z;
		read(x),read(y),read(z);
		g[x].push_back(Edge(x,y,z));
		g[y].push_back(Edge(y,x,z));
	}
	
	for(int i=1;i<=n;i++) fr[i].clear();
	dijkstra(s1,dist1);
	for(int i=1;i<=n;i++) fr1[i]=fr[i];
	
	for(int i=1;i<=n;i++) fr[i].clear();
	dijkstra(t1,dist2);
	for(int i=1;i<=n;i++) fr2[i]=fr[i];
	
	for(int i=1;i<=n;i++) fr[i].clear();
	dijkstra(s2,dist3);
	for(int i=1;i<=n;i++) fr3[i]=fr[i];
	
	for(int i=1;i<=n;i++) fr[i].clear();
	dijkstra(t2,dist4);
	for(int i=1;i<=n;i++) fr4[i]=fr[i];
	
	/*
	printf(" 1  --  ");
	for(int i=1;i<=n;i++) {
		printf("%d ",dist1[i]);
	}
	printf("\n");
	printf(" 1  --  \n");
	for(int i=1;i<=n;i++) {
		printf("    %d  --  ",i);
		for(int j=0;j<fr1[i].size();j++) printf("%d ",fr1[i][j]);
		printf("\n");
	}
	
	printf(" 2  --  ");
	for(int i=1;i<=n;i++) {
		printf("%d ",dist2[i]);
	}
	printf("\n");
	printf(" 2  --  \n");
	for(int i=1;i<=n;i++) {
		printf("    %d  --  ",i);
		for(int j=0;j<fr2[i].size();j++) printf("%d ",fr2[i][j]);
		printf("\n");
	}
	
	printf(" 3  --  ");
	for(int i=1;i<=n;i++) {
		printf("%d ",dist3[i]);
	}
	printf("\n");
	printf(" 3  --  \n");
	for(int i=1;i<=n;i++) {
		printf("    %d  --  ",i);
		for(int j=0;j<fr3[i].size();j++) printf("%d ",fr3[i][j]);
		printf("\n");
	}
	
	printf(" 4  --  ");
	for(int i=1;i<=n;i++) {
		printf("%d ",dist4[i]);
	}
	printf("\n");
	printf(" 4  --  \n");
	for(int i=1;i<=n;i++) {
		printf("    %d  --  ",i);
		for(int j=0;j<fr4[i].size();j++) printf("%d ",fr4[i][j]);
		printf("\n");
	}
	*/
	
	for(int i=1;i<=n;i++) for(int j=0;j<fr1[i].size();j++) a[i][fr1[i][j]]++;
	for(int i=1;i<=n;i++) for(int j=0;j<fr2[i].size();j++) b[i][fr2[i][j]]++;
	for(int i=1;i<=n;i++) for(int j=0;j<fr2[i].size();j++) a[i][fr2[i][j]]++;
	for(int i=1;i<=n;i++) for(int j=0;j<fr4[i].size();j++) b[i][fr4[i][j]]++;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/rabbit_ZAR/article/details/85250901