萌新刚学OI,样例未过,求助
查看原帖
萌新刚学OI,样例未过,求助
735763
_ChongYun_楼主2023/9/20 10:58
#include<bits/stdc++.h>
#define int long long 
using namespace std;
int sum=0;
int n,m,ans=0;
int s1,t1,l1,s2,t2,l2;
struct node{
	int to,nxt,val;
}w[114514<<1];
int h[114514<<1];
int cnt=0;
void Link(int x,int y,int val){
	++cnt;
	w[cnt].to=y;
	w[cnt].nxt=h[x];
	w[cnt].val=val;
	h[x]=cnt;
}
bool vis[114514<<1];
int dis[114514<<1],diss[114514<<1];
int u[114514<<1],v[114514<<1],ww[114514<<1];
int pre[114514<<1];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q; 
void dijkstra(int st){
	for(int i=1;i<=n;i++){
		dis[i]=INT_MAX;
		diss[i]=INT_MAX;
	}
	diss[st]=dis[st]=0;
	q.push(make_pair(0,st));
	while(!q.empty()){
		int xx=q.top().first;
		int x=q.top().second;
		q.pop();
		vis[x]=false;
		for(int i=h[x];i!=0;i=w[i].nxt){
			int y=w[i].to,val=w[i].val;
			if(dis[y]>dis[x]+1||(dis[y]>dis[x]+val&&dis[y]==dis[x]+1)){
				pre[y]=x;
				dis[y]=dis[x]+1;
				diss[y]=diss[x]+val;
				if(!vis[y]){
					vis[y]=true;
					q.push(make_pair(dis[y],y));
				}
			}
		}
	}
	return ;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i]>>ww[i];
		Link(u[i],v[i],ww[i]);
		Link(v[i],u[i],ww[i]);
		sum+=ww[i];
	}
	dijkstra(1);
	memset(vis,false,sizeof(vis));
	vis[1]=true;
	int ui=n;
	while(ui!=1){
		vis[ui]=true;
		ui=pre[ui];
	}
	for(int i=1;i<=m;i++){
		if((vis[u[i]])&&(vis[v[i]])&&(ww[i]==0)) ans++;
		if(((!vis[u[i]])||(!vis[v[i]]))&&(ww[i]==1)) ans++;
	}
	cout<<ans<<endl;
	for(int i=1;i<=m;i++){
		if((vis[u[i]])&&(vis[v[i]])&&(ww[i]==0)) cout<<u[i]<<" "<<v[i]<<" 1"<<endl;
		if(((!vis[u[i]])||(!vis[v[i]]))&&(ww[i]==1)) cout<<u[i]<<" "<<v[i]<<" 0"<<endl;
	}
	return 0;
}
2023/9/20 10:58
加载中...