CCPC-Wannafly Winter Camp Day5 (Div2, onsite)

43 篇文章 1 订阅
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100501
struct NODE{
	int w;
	int e;
	int next; //next[i]表示与第i条边同起点的上一条边的储存位置
}edge[MAXN];
int cnt;
int head[MAXN]; 
void add(int u,int v,int w){
	edge[cnt].w=w;
	edge[cnt].e=v;    //edge[i]表示第i条边的终点 
	edge[cnt].next=head[u]; //head[i]表示以i为起点的最后一条边的储存位置 
	head[u]=cnt++;
}
int main(){
	memset(head,0,sizeof(head));
	cnt=1;
	int n;
	cin>>n;
	int a,b,c;
	while(n--){
		cin>>a>>b>>c;
		add(a,b,c);
	}
	int start;
	cin>>start;
	for(int i=head[start];i!=0;i=edge[i].next)
	   cout<<start<<"->"<<edge[i].e<<" "<<edge[i].w<<endl;
	return 0;
}

Cactus Draw

题目描述

你有一棵树,你想把它画在平面上,使得没有边相交。

输入描述

第一行两个整数n,m(1≤n≤1000,1≤m≤2000),表示点数和边数。

接下来m行,每行两个正整数u,v(1≤u,v≤n,u!=v),保证不存在重边。

输出描述

输出n行,每行两个整数xi​,yi​(1≤xi​,yi​≤n),表示将第ii个点画到(xi​,yi​)的位置,要求图中的每对边如果有公共点,那么只能在端点相交,否则不能相交。

如果有多组解,那么输出任意的解即可。

样例输入 1         样例输出1

5 4          1 1
1 2          2 2
2 3          3 3
1 4          2 4
1 5          2 5

额前向星跑dfs而已。

#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
const int maxn=1e6+3;
long long head[maxn],cnt,n,m;
struct e{
	long long to;
	long long next;
//next[i]表示与第i条边同起点的上一条边的储存位置
}edge[maxn];
void add(long long u,long long v){
	edge[cnt].to=v;
	edge[cnt].next=head[u];
//head[i]表示以i为起点的最后一条边的储存位置
	head[u]=cnt++;
}
struct node{
    long long x;
	long long y;	
}ans[maxn];//用ans输出每个点位置 
long long num=1;//起始y坐标点 
void dfs(long long u,long long fa,long long len){
	//标记父节点避免跑死循环 
	for(int i=head[u];i!=-1;i=edge[i].next){
		int v=edge[i].to;
		if(v==fa)continue;
		ans[v].x=len; ans[v].y=num;
		num++;
		dfs(v,u,len+1); 
	}
}
int main(){
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	long long a,b;
	long long cnt=0;
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	ans[1].x=1;ans[1].y=1; 
	dfs(1,-1,2);//从点1开始,其实从那个点开始随便 
	for(int i=1;i<=n;i++)
		printf("%lld %lld\n",ans[i].x,ans[i].y);	
	return 0;
}

顺便贴个链式前向星留着以后用。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100501
struct NODE{
	int w;
	int e;
	int next; //next[i]表示与第i条边同起点的上一条边的储存位置
}edge[MAXN];
int cnt;
int head[MAXN]; 
void add(int u,int v,int w){
	edge[cnt].w=w;
	edge[cnt].e=v;    //edge[i]表示第i条边的终点 
	edge[cnt].next=head[u]; //head[i]表示以i为起点的最后一条边的储存位置 
	head[u]=cnt++;
}
int main(){
	memset(head,0,sizeof(head));
	cnt=1;
	int n;
	cin>>n;
	int a,b,c;
	while(n--){
		cin>>a>>b>>c;
		add(a,b,c);
	}
	int start;
	cin>>start;
	for(int i=head[start];i!=0;i=edge[i].next)
	   cout<<start<<"->"<<edge[i].e<<" "<<edge[i].w<<endl;
	return 0;
}

https://blog.csdn.net/lookqaq/article/details/81304637

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值