WA on #8求调
查看原帖
WA on #8求调
593299
Qerucy楼主2024/10/14 19:59

rt,用的是 bfs + 拓扑排序,求调。

#include<bits/stdc++.h>

using namespace std;

int n,m;
int x,y,z;
int dis[100010];
bool vis[100010];
int f[100010];
int pre[100010];
int nxt[100010];
int in[100010];
int ans;

struct node{
	int to,w;
};

vector<node>v[100010],newv[100010];

queue<int>q;

void bfs(){
	q.push(1);
	dis[1]=0;
	vis[1]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=0;i<v[x].size();i++){
			int to=v[x][i].to;
			if(vis[to]){
				if(dis[to]==dis[x]+1){
					newv[x].push_back(v[x][i]);
				}
				continue;
			}
			vis[to]=1;
			dis[to]=dis[x]+1;
			q.push(to);
			newv[x].push_back(v[x][i]);
			in[to]++;
		}
	}
}

void dfs(int x){
	if(pre[x]==0){
		//printf("%d ",x);
		return;
	}
	nxt[pre[x]]=x;
	dfs(pre[x]);
	//printf("%d ",x);
}

void dp(){
	q.push(1);
	f[1]=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=0;i<newv[x].size();i++){
			int to=newv[x][i].to;
			
			//printf("%d %d\n",f[x]+newv[x][i].w,f[to]);
			
			if(f[x]+newv[x][i].w>f[to]){
				//puts("qwq");
				f[to]=f[x]+newv[x][i].w;
				pre[to]=x;
			}
			in[to]--;
			if(!in[to]) q.push(to);
		}
	}
}

signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		f[i]=-1;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		v[x].push_back((node){y,z});
		v[y].push_back((node){x,z});
	}
	bfs();
	dp();
	
	//printf("qwq %d\n",f[n]);
	
	/*for(int x=1;x<=n;x++){
		for(int i=0;i<newv[x].size();i++){
			int to=newv[x][i].to;
			printf("%d ",to);
		}
		puts("");
	}
	*/
	
	dfs(n);
	
	for(int x=1;x<=n;x++){
		for(int i=0;i<v[x].size();i++){
			int to=v[x][i].to;
			if(to==nxt[x]){
				if(v[x][i].w==0){
					ans++;
				}
			}
			else if(v[x][i].w==1){
				if(x<to){
					ans++;
				}
			}
		}
	}
	
	printf("%d\n",ans);
	
	for(int x=1;x<=n;x++){
		for(int i=0;i<v[x].size();i++){
			int to=v[x][i].to;
			if(to==nxt[x]){
				if(v[x][i].w==0){
					printf("%d %d %d\n",x,to,1);
				}
			}
			else if(v[x][i].w==1){
				if(x<to){
					printf("%d %d %d\n",x,to,0);
				}
			}
		}
	}
	
	//for(int i=1;i<=n;i++) printf("%d ",pre[i]);
	return 0;
}
2024/10/14 19:59
加载中...