[USACO09FEB] Revamping Trails G 계층화
[USACO09FEB] Revamping Trails G 계층화
제목 설명
Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= 50,000) trails conveniently numbered 1..M from pasture 1 all the way out to pasture N (a journey which is always possible for trail maps given in the test data). The N (1 <= N <= 10,000) pastures conveniently numbered 1..N on Farmer John's farm are currently connected by bidirectional dirt trails. Each trail i connects pastures P1_i and P2_i (1 <= P1_i <= N; 1 <= P2_i <= N) and requires T_i (1 <= T_i <= 1,000,000) units of time to traverse.
He wants to revamp some of the trails on his farm to save time on his long journey. Specifically, he will choose K (1 <= K <= 20) trails to turn into highways, which will effectively reduce the trail's traversal time to 0. Help FJ decide which trails to revamp to minimize the resulting time of getting from pasture 1 to N.
TIME LIMIT: 2 seconds
입력 형식
출력 형식
제목 번역
존은 모두 (N\) 목장을 가지고 있다.먼지가 잔뜩 낀 실루엣을\(M\) 줄로 연결합니다.오솔길은 양방향으로 통행할 수 있다.매일 아침 존은 목장 (1\) 에서 목장 (N\) 으로 출발하여 젖소의 몸을 검사한다.
모든 오솔길을 통과하는 데는 일정한 시간이 필요하다.John은 고속도로가 되도록 그 중의\(K\) 오솔길을 업그레이드할 계획이다.고속도로에서의 통행은 거의 순식간에 이루어졌기 때문에 고속도로의 통행 시간은\(0\)이다.
존이 매일\(1\) 호 목장에서\(N\) 호 목장으로 가는 데 걸리는 시간을 가장 짧게 하기 위해 어떤 오솔길을 업그레이드할지 결정하도록 도와주십시오.
출력 샘플 가져오기
#1 입력
4 4 1
1 2 10
2 4 10
1 3 1
3 4 100
출력 #1
1
설명 / 프롬프트
K is 1; revamp trail 3->4 to take time 0 instead of 100. The new shortest path is 1->3->4, total traversal time now 1.
사고방식 분석
Code
#include
#include
const int maxn=1000000; // , , RE , ~(bushi)
const int maxm=10000000;
using namespace std;
int head[maxn],vis[maxn],dis[maxn];
struct Edge{
int to,next,val;
}edge[maxm];
int tot = 0;
void Addedge(int x,int y,int z){
edge[++tot].to = y;
edge[tot].val = z;
edge[tot].next = head[x];
head[x] = tot;
}
struct node{ //
int num,dis;
node(){}
node(int x,int y){num=x;dis=y;}
bool operator < (const node &a)const{
return dis>a.dis;
}
};
void Dij(int x){ //
priority_queueq;
memset(dis,0x3f,sizeof(dis));
dis[x] = 0;
q.push(node(x,0));
while(!q.empty()){
node t = q.top();q.pop();
int u = t.num;
if(vis[u])continue;
vis[u] = 1;
for(int i = head[u];~i;i = edge[i].next){
int v = edge[i].to;
if(dis[v]>dis[u]+edge[i].val){
dis[v] = dis[u]+edge[i].val;
q.push(node(v,dis[v]));
}
}
}
}
int main(){
int n,m,k;scanf("%d%d%d",&n,&m,&k);
memset(head,-1,sizeof(head));
int End = (k+1)*n + 1; // k+1
int a,b,c;
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&a,&b,&c);
for(int j = 0;j <= k;j++){
Addedge(a+j*n,b+j*n,c); // ,
Addedge(b+j*n,a+j*n,c);
}
for(int j = 1;j <= k;j++){
Addedge(a+(j-1)*n,b+j*n,0); // ,
Addedge(b+(j-1)*n,a+j*n,0);
}
}
for(int i = 0;i <= k;i++)Addedge(n*(1+i),End,0); //
Dij(1);
printf("%d",dis[End]);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.