1.挖地雷
这道题,第一想法
Floyd
但是一个很大的问题是
怎么存路径
这是一个很玄学的问题
于是我就想到了很阴间的思路:
hash
然后一个小时之后
弃
然后仔细看看题面
显然这是一个DAG,那么针对DAG,就可以拓扑排序
原理就是像解锁科技树一样一点一点删入度就行
这样我们就可以寻找道路并选出最短(最长)的一条
有点像模拟
记录路径的话可以记录每个点的前一个点然后递归输出即可
代码:
#include<bits/stdc++.h>
#define N 20005
using namespace std;
struct edge{
int to,nxt,cost;
}e[N];
int head[N],ecnt=-1,a[N],n,dis[N],in[N],dir[N];
void insert(int x,int y,int z){
e[++ecnt]={y,head[x],z};
in[y]++;
head[x]=ecnt;
}
void print(int x){
if(!dir[x]){
printf("%d",x);
return;
}
print(dir[x]);
printf("-%d",x);
}
queue<int>q;
void topo(){
for(int i=1;i<=n;i++){
if(!in[i]){
q.push(i);
dis[i]=a[i];
}
}
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=head[now];~i;i=e[i].nxt){
int go=e[i].to;
int c=e[i].cost;
if(dis[go]<dis[now]+c){
dis[go]=dis[now]+c;
dir[go]=now;
}
//printf("%d %d %d\n",now,go,dis[go]);
in[go]--;
if(!in[go])
q.push(go);
}
}
}
/*void dfs(int x){
if(!e[x].to){
return;
}
for(int i=head[x];~i;i=e[i].nxt){
}
}*/
int main(){
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int x,y;
while(scanf("%d%d",&x,&y)){
if(x==0&&y==0)
break;
insert(x,y,a[y]);
}
/*for(int i=1;i<=n;i++){
for(int j=head[i];~j;j=e[j].nxt){
printf("%d %d %d %d\n",i,e[j].to,e[j].nxt,e[j].cost);
}
}*/
topo();
int ans=1;
for(int i=1;i<=n;i++)
if(dis[ans]<dis[i])
ans=i;
print(ans);
printf("\n");
printf("%d",dis[ans]);
/*for(int i=1;i<=n;i++){
dfs(i);*/
return 0;
}
/*
6
5 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
0 0
*/
2.最短路径
同上
代码:
#include<bits/stdc++.h>
#define N 20005
using namespace std;
struct edge{
int to,nxt,cost;
}e[N];
int head[N],ecnt=-1,a[N],n,dis[N],in[N],dir[N];
void insert(int x,int y,int z){
e[++ecnt]={y,head[x],z};
in[y]++;
head[x]=ecnt;
}
void print(int x){
if(!dir[x]){
printf("%d",x);
return;
}
print(dir[x]);
printf(" %d",x);
}
queue<int>q;
void topo(){
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++){
if(!in[i]){
q.push(i);
dis[i]=a[i];
}
}
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=head[now];~i;i=e[i].nxt){
int go=e[i].to;
int c=e[i].cost;
if(dis[go]>dis[now]+c){
dis[go]=dis[now]+c;
dir[go]=now;
}
//printf("%d %d %d\n",now,go,dis[go]);
in[go]--;
if(!in[go])
q.push(go);
}
}
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;
scanf("%d",&x);
if(x)
insert(i,j,x);
}
}
/*for(int i=1;i<=n;i++){
for(int j=head[i];~j;j=e[j].nxt){
printf("%d %d %d %d\n",i,e[j].to,e[j].nxt,e[j].cost);
}
}*/
topo();
int ans=1;
for(int i=1;i<=n;i++)
if(dis[ans]<dis[i])
ans=i;
printf("minlong=%d\n",dis[ans]);
print(ans);
return 0;
}
/*
10
0 2 5 1 0 0 0 0 0 0
0 0 0 0 12 14 0 0 0 0
0 0 0 0 6 10 4 0 0 0
0 0 0 0 13 12 11 0 0 0
0 0 0 0 0 0 0 3 9 0
0 0 0 0 0 0 0 6 5 0
0 0 0 0 0 0 0 0 10 0
0 0 0 0 0 0 0 0 0 5
0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0
*/