您的位置:首页 > 其它

清北暑假模拟day2 之

2016-10-19 19:13 225 查看


/*
现场代码,枚举每条边删除
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define mx 1005

using namespace std;
struct orz
{
int d,p;
friend bool operator <(orz a,orz b) {return a.d>b.d;}
};
struct Edge{
int to;
int w;
int id;
};
priority_queue < orz > ss;
int flag,cnt,v[mx],d[mx],n,m,l;
vector<Edge> edge[mx];
bool vis[mx];
void input(){
cin>>n>>l;
int u,v,wei;
Edge test;
for(int i = 1;i <= l;i++){
cin>>u>>v>>wei;
if(u == v) continue;
test.id = ++cnt;
test.to = v;
test.w = wei;
edge[u].push_back(test);
test.to = u;
edge[v].push_back(test);
}
m = 1;
}
void dij(int s)
{
for(int i = 0;i < mx;i++) d[i] = 1000000000;
d[s]=0;
orz tmp;
tmp.d=0,tmp.p=s;
ss.push(tmp);
flag++;
int x,dd;
Edge j;
while (!ss.empty())
{
tmp=ss.top();
ss.pop();
x=tmp.p,dd=tmp.d;
if (v[x]==flag) continue;
v[x]=flag;
for (int i = 0;i < edge[x].size();i++){
if(vis[edge[x][i].id]) continue;
j = edge[x][i];
if (d[j.to]>dd+j.w)
{
d[j.to]=dd+j.w;
tmp.d=dd+j.w,tmp.p=j.to;
ss.push(tmp);
}
}

}
}
int main(){
freopen("di.in","r",stdin);
freopen("di.out","w",stdout);
input();
int ans = 0;
for(int i = 1;i <= cnt;i++){
vis[i] = true;
dij(1);
vis[i] = false;
if(d
< 1000000000) ans = max(ans,d
);
}
cout<<ans;
return 0;
}
/*
要使最短路改变,就只能删除最短路经过的边
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=210;
const int maxm=50010;

int n,m,en,f[maxn],q[maxn],dist[maxn],edg[maxm][3],z[maxn];

bool use[maxn];

struct edge
{
int e,d,id;
edge *next;
}*v[maxn],ed[maxm<<1],*fe[maxn];

void add_edge(int id,int s,int e,int d)
{
en++;
ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;v[s]->d=d;v[s]->id=id;
}

void spfa()
{
int front=0,tail=1;
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
use[1]=true;
q[0]=1;
for (;front!=tail;)
{
int now=q[front++];
if (front==maxn) front=0;
use[now]=false;
for (edge *e=v[now];e;e=e->next)
if (dist[e->e]>dist[now]+e->d)
{
dist[e->e]=dist[now]+e->d;
f[e->e]=now;fe[e->e]=e;
if (!use[e->e])
{
use[e->e]=true;
q[tail++]=e->e;
if (tail==maxn) tail=0;
}
}
}
}

int main()
{
freopen("di.in","r",stdin);
freopen("di.out","w",stdout);

scanf("%d%d",&n,&m);
for (int a=1;a<=m;a++)
scanf("%d%d%d",&edg[a][0],&edg[a][1],&edg[a][2]);
for (int a=1;a<=m;a++)
{
add_edge(a,edg[a][0],edg[a][1],edg[a][2]);
add_edge(a,edg[a][1],edg[a][0],edg[a][2]);
}
spfa();
int cnt=0;
for (int a=n;a!=1;a=f[a])
z[++cnt]=fe[a]->id;
int ans=-1;
for (int a=1;a<=cnt;a++)
{
en=0;
memset(v,0,sizeof(v));
for (int b=1;b<=m;b++)
if (b!=z[a])
{
add_edge(b,edg[b][0],edg[b][1],edg[b][2]);
add_edge(b,edg[b][1],edg[b][0],edg[b][2]);
}
spfa();
if (dist
!=0x3f3f3f3f) ans=max(ans,dist
);
}
printf("%d\n",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: