#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;
}